Мне нужен профилировщик безопасности для python. В частности, я хочу что-то, что будет принимать в качестве входных данных программу Python и сообщать мне, пытается ли программа выполнять системные вызовы, читать файлы или импортировать библиотеки. Если такой профилировщик безопасности существует, где я могу его найти? Если такой вещи не существует, и я должен был написать ее сам, где я мог бы «проверить» свой профилировщик (то есть убедиться, что он работает).
Если вы не найдете этот вопрос подходящим для SO, дайте мне знать, есть ли другой сайт SE, на котором я могу опубликовать это, или, если возможно, как я могу изменить/перефразировать свой вопрос. Спасибо
Важно, чтобы он мог отслеживать такие вещи, как импорт других файлов или чтение и запись в файлы. Я подозреваю, что для этого потребуются специальные знания языка программирования Python, однако, если это можно сделать для произвольных языков, этого будет достаточно.
Обычно Python использует интерпретатор под названием CPython. Трудно сказать о самом коде Python, открывает ли он файлы или делает что-то особенное, потому что многие библиотеки Python и сам интерпретатор написаны на C, и системные вызовы/вызовы libc могут происходить только оттуда. Также синтаксис Python сам по себе может быть очень непонятным.
Итак, отвечая вашему подозреваемому: I suspect this would need specific knowledge of the python programming language
, это не похоже на то, потому что речь идет о языке C.
Вы можете подумать, что можно исправить сам CPython. Ну это тоже не правильно, как я думаю. Многие разделяемые библиотеки используют код C/C++ как сам CPython. Тензорфлоу, например.
Идя дальше, я думаю, можно сделать следующие вещи:
Python — не тот язык, который легко помещается в песочницу. Пример:
x = [x for x in [].__class__.__base__.__subclasses__() if x.__name__ == 'ca'+'tch_warnings'][0].__init__
x.__getattribute__("__globals__")['__builtins__']['eval']("__import__('os').system('ls')")
Для каждых N регулярных выражений/шаблонов есть N+1 способов их обойти. Не говоря уже о том, что люди также могут создавать функции из необработанного байт-кода Python, используя types.FunctionType
. Самый простой способ — запустить скрипт внутри nsjail и посмотреть, не пытается ли он выполнить какие-либо подозрительные действия.
Обновлено: Теоретически существует PEP 578 с хуками аудита, но на самом деле их банально обходят.
Очень качественные ответы (относительно ваших последних двух), хотя x
класса function
в вашем конкретном примере нет атрибута func_globals, поэтому, если вы запустите это, вы должны получить AttributeError
.
Вы правы, я забыл, что пример изначально был для python2, но для python3 он требует минимальных изменений. Я обновил сообщение с правильным примером.
хорошая мысль @BonusPlay, но никто не стал бы писать такой код
Почему никто просто не хочет использовать AppArmor или что-то в этом роде? Все эти уловки можно легко обойти с помощью inspect
или любого кода C...
@BonusPlay Не могли бы вы добавить, как тривиально обходят хуки аудита? Будет полезной информацией для дальнейших читателей этой ветки!
Не все опасные функции создают события аудита. Пример опасной функции, которая не вызывает один, это os.spawnlp
. Прочтите почему не песочница, чтобы понять, почему это так.
Нельзя ли запустить «обычный» профилировщик для процесса python? Итак, я говорю, что этот профилировщик не должен быть специфичным для python, или нет?