Я пытаюсь разработать структуру, которая будет компилировать и выполнять (в основном случайные) C++ и Java-пакеты.
Однако, учитывая их случайный характер, я хочу проверить исходный код (или исполняемый файл - предварительное исполнение) для любых системных вызовов linux перед выполнением. Если есть такой системный вызов, я не хочу выполнять программу.
Можно с уверенностью предположить, что эти пакеты не потребуют каких-либо системных вызовов для выполнения их функционального назначения (они не являются сложными пакетами).
Изменить: команда bash/script будет простейшей, но любой ответ будет прекрасен.
Короче говоря, вы не можете надежно обнаружить все вредоносные системные вызовы (путем статического анализа исходного кода); читайте о проблеме с остановкой и теореме Райса... BTW MELT будет немного лучше, чем grep
поскольку он работает с представлением GCC gimple.
Подумайте (о Linux)
libc
(или основной исполняемый файл), затем dlsym
-ing "system"
чтобы получить указатель на system
функциюlibc
, затем адрес компьютерной system
, добавив некоторое известное смещение в адрес malloc
system
с помощью fork
и execve
....Конечно, вы можете доверять своему пользователю (я не буду этого делать для веб-приложения). Если вы доверяете всем своим пользователям и просто хотите обнаружить ошибки, вы можете фильтровать некоторые из них.
Вам нужен контейнер, например докер
Просмотрите ограничения ресурсов (setrlimit, если вы находитесь в системе POSIX), а не пытаетесь найти вредоносный код.
Вы можете ограничить количество процессов, памяти, открытых файлов, cputime и других. Я бы предложил вам ограничить в основном все. И запустите в chroot тюрьме (даже пустой, если вы ставите статично).
grep
это то, что вы ищете.