Как создать воспроизводимый файл iso с помощью mkisofs/genisoimage?

Источники и awk— плохие идеи

Получение таких файлов с помощью интерпретатора сценариев оболочки — плохая идея, так как появляется еще одно место, где злоумышленник может скрыть сценарий оболочки для выполнения с правами суперпользователя или может вводить такие вещи, как переопределить такие переменные, как PATH, LANGи LD_LIBRARY_PATH.

% cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch with subversive \$PATH)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
echo 1>&2 'install -m 0644 /etc/shadow /home/malefactor/etc/ 2>/dev/null'
PATH="/home/malefactor/bin:${PATH}"
%
% ( source /etc/os-release ; command -v start-stop-daemon ; )
install -m 0644 /etc/shadow /home/malefactor/etc/ 2>/dev/null
/home/malefactor/bin/start-stop-daemon
%

Sourcing фактически нарушает одну из определенных семантик для /etc/os-release, которая заключается в том, что (, цитируя его руководство ), «расширение переменных явно не поддерживается».

Точно так же awk, как указано в ответе Арчемара, неправильно обрабатывает цитирование; и можно указать любое значение. Обратите внимание, что ответ Archemar не относится к значению VERSIONв вопросе, для которого данный скрипт awkне предоставляет правильного значения, потому что он ошибочно сохраняет кавычки и не обрабатывает управляющие последовательности.

% awk -F= '$1=="VERSION" { print $2 ;}' /etc/os-release
"9 (stretch)"      
% awk -F= '$1=="PRETTY_NAME" { print $2 ;}' /etc/os-release
"Debian GNU/Linux 9 (stretch with subversive \$PATH)"
%

/etc/os-releaseна самом деле разрешена довольно широкая свобода в цитировании, а также требуется, чтобы управляющие последовательности обрабатывались должным образом. awkвообще не подходит для этой работы.

Есть и другие, более тонкие,такие проблемы, как утечка уже установленных переменных в результаты, если в файле отсутствует фактический искомый ключ.

% ( source /etc/os-release ; echo $LANG ; )
install -m 0644 /etc/shadow /home/malefactor/etc/ 2>/dev/null
en_GB.UTF-8
%

Кроме того, если IDили PRETTY_NAMEотсутствуют, они определяются как имеющие значения по умолчанию. И вдобавок ко всему, есть запасной вариант /usr/lib/os-release.

Обучение у других людей

Файлы, содержащие ключ -равный -присвоения значений, с кавычками, экранированием и комментариями в стиле sh-, являются довольно распространенным явлением. Некоторые языки программирования имеют библиотечные функции для работы с ними напрямую. Урок изменения правил OpenBSD на /etc/rc.confв OpenBSD 5.6 заключается в том, что более разумно использовать такие библиотечные функции, если они доступны, или специальные инструменты, которые не имеют возможностей полноценного интерпретатора оболочки, для обработки таких файлов.

Из сценариев оболочки я, например, использую инструмент с именем read-confдля обработки таких файлов:

% read_os() {
    if test -r /etc/os-release
    then
        clearenv setenv "$1" "$2" read-conf /etc/os-release printenv "$1"
    else
        clearenv setenv "$1" "$2" read-conf /usr/lib/os-release printenv "$1"
    fi
}
% read_os ID linux
debian
% read_os VERSION
9 (stretch)
% read_os PRETTY_NAME Linux
Debian GNU/Linux 9 (stretch with subversive $PATH)
% read_os PATH
/home/malefactor/bin:${PATH}
% read_os LANG
%

Вышеизложенное основано на том, что команды setenv, read-confи printenvвстраиваются -в команды набора инструментов nosh, так что каждая из команд clearenv, setenvи read-confнаходит следующую команда в цепочке без использования переменной окружения PATH. (До того, как я добавил встроенный -в printenv, несколько более длинные исходные лайнеры -тщательно использовали "`command -v printenv`", чтобы избежать поискаprintenvпосле того, как зараженный файл конфигурации был злонамеренно установлен измененный PATHи после того, как clearenvстер эту переменную из среды.)

Дополнительная литература

  • Тео де Раадт и др. (2014 -11 -01 ).Список изменений OpenBSD 5.6. OpenBSD.
  • Джонатан де Бойн Поллард (2018 ). «read-conf». Руководство . нош набор инструментов. Программное обеспечение.
  • Джонатан де Бойн Поллард (2018 ). «clearenv». Руководство . нош набор инструментов. Программное обеспечение.
  • Джонатан де Бойн Поллард (2018 ). «setenv». Руководство . нош набор инструментов. Программное обеспечение.
  • Джонатан де Бойн Поллард (2018 ). «printenv». Руководство . нош набор инструментов. Программное обеспечение.
3
13.03.2020, 17:54
0 ответов

Теги

Похожие вопросы