Функция system()
выполняет команду, заданную в качестве аргумента, передавая ее /bin/sh -c
. Я думаю, что программа /usr/bin/id
не имеет особого значения; это ключевое слово оболочки. В частности, обратите внимание, что поведение запуска командной оболочки отличается, когда реальный и эффективный UIDs отличаются:
Если оболочка запускается с эффективным пользователя (группы), не совпадающим с реальным пользователем (группа) ID [. ..] нет загрузочных файлов, функции оболочки не наследуются от среды, переменные SHELLOPTS, BASHOPTS, CDPATH и GLOBIGNORE, если они отображаются в среде, игнорируются, а эффективный идентификатор пользователя устанавливается на реального пользователя Я бы.
- BASH 4.1 ручной
В том случае, если программа, содержащая код, который вы представленный установлен SUID, код предотвращает условия, приведенные в этом пункте от применения путем установления реальной, эффективной, и сохраненные UIDs все равны эффективному UID (который будет UID владельца исполняемого файла).
Эксплуатации обычно вращаются вокруг небезопасного использования ненадежных данных, причем переменные окружения являются частыми нарушителями.В переменной среды ENV
в частности указывается файл, который при некоторых обстоятельствах оболочка будет выполняться при запуске. bash
не запускает его, когда реальный и эффективный UID отличаются, как описано в выдержке выше, но в противном случае это сделает при вызове интерактивно в режиме совместимости с POSIX или как sh
.
Это не помогает для неинтерактивного вызова, как это применимо здесь, поэтому теперь мне нужно идти спекулятивно. I подозреваемый, но в настоящее время не может документировать, что некоторые другие прошлое - и, возможно, даже настоящие - версии оболочки do выполняют команды чтения и выполнения из файла с именем ENV
при вызове неинтерактивно. Это обеспечило бы вектор для выполнения произвольных команд в качестве владельца программы setuid.
В слабой поддержке этой спекуляции я направляю свое внимание на BASH_ENV
переменную, которая аналогична ENV
, но используется, когда bash
вызывается не в интерактивном режиме, так как bash
. Я полагаю, что, как только эти две переменные были более параллельными, применимы как к интерактивным, так и к неинтерактивным режимам, но неинтерактивное использование ENV
и интерактивное использование BASH_ENV
были удалены в разное время. по разным причинам. Вполне возможно, что неинтерактивное использование ENV
было удалено, чтобы подключить точно отверстие, которое вы ищете.
Что заставляет вас думать, что есть уязвимость, которую можно найти? –
Если у вас была * уязвимость этого типа, она будет зависеть от того, установлен ли исполняемый файл с установленным битом suid. В частности, только если у программы установлен бит suid бит, ее эффективный UID будет равен UID владельца файла. –
Кроме того, если была уязвимость, то она полагалась бы либо на то, что функция 'system()' использует '/ bin/sh -c' для запуска команды, либо при некотором поведении'/usr/bin/id', которая зависела от реального UID процесса. Насколько мне известно, 'id' работает одинаково независимо от реальных и эффективных UID. –