The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Достижение выполнения кода при контроле над текстом комментария в Python-скрипте

03.08.2025 07:50

Один из участников соревнования UIUCTF 2025, подробно разобрал, как ему удалось выполнить задание, требующее добиться исполнения своего кода на сервере, имея лишь возможность изменения содержимого текста комментария в коде.

Участники могли отправить сетевой запрос к Python-скрипту, который создавал новый Python-скрипт cо случайными именем, добавлял поступившие от пользователя данные в текст комментария, вырезав символы "\n" и "\r", и запускал этот скрипт командой "python3 имя.py". Контролируя только содержимое комментария участник должен был извлечь строку из файла "/home/ctfuser/flag". Скрипт создавался следующим кодом:


   comment = input("> ").replace("\n", "").replace("\r", "")
   code = f"""print("hello world!")
   # This is a comment. Here's another:
   # {comment}
   print("Thanks for playing!")"""

Вместо "{comment}" подставлялись данные, поступившие от участника, и в итоге запускался следующий код:


   print("hello world!")
   # This is a comment. Here's another:
   # Данные, поступившие от участника соревнования
   print("Thanks for playing!")

Задание было сформировано по мотивам уязвимости в парсере CPython, который обрабатывал символ с нулевым кодом, как окончание строки (уязвимость, например, можно было использовать для скрытия вредоносных действий в тексте комментария). Проблема была устранена в выпусках CPython 3.12.0 и 3.11.4. В применяемом в конкурсе обработчике вырезались только символы "\n" и "\r", но при использовании уязвимой версии СPython участник мог использовать символ "\0" как разделитель. Тем не менее этот трюк не сработал так как в конкурсе использовалась уже исправленная версия CPython c расчётом, что в парсере могут оставаться ещё какие-то похожие ошибки и участники смогут их выявить.

Успешно справившийся с заданием участник не стал искать новые уязвимости в парсере, которые бы позволили разбить строку на чаcти, а воспользовался особенностью выполнения в Python файлов по типу их содержимого. Например, вместо исходного кода в файл с расширением ".py" можно поместить прокэшированный байткод, сохраняемый в файлах с расширением ".pyc", и подобный файл будет выполнен. В рассматриваемом конкурсе участник мог контролировать только содержимое в середине файла, поэтому не мог добавить свой заголовок для искажения MIME-типа.

Задачу удалось решить, воспользовавшись тем, что Python начиная с ветки 2.6 может исполнять содержимое ZIP-архивов для поставки Python-пакетов в сжатом виде. Как и в случае с кэшем байткода наличие zip-архива определяется по содержимому, а не по расширению файла, т.е. в "файл.py" можно поместить zip-архив и при запуске командой "python файл.py" он будет обработан, как сжатый Python-пакет. При этом ZIP-архивы в Python индексируются не по заголовку в начале файла, а по секции EOCD (End of Central Directory Record) в конце файла. При наличии в архиве файла "__main__.py", этот файл запускается автоматически при прямом запуске архива командой "python архив".

Конкурсная задача была решена генерацией подобного ZIP-архива и подстановкой его в текст комментария. Для сохранения корректности структуры файла в условиях наличия в конце исходного файла вызова 'print("Thanks for playing!")', было использовано наличие в EOCD-секции области комментария, размещаемой в самом конце.



  1. Главная ссылка к новости (https://www.hacktron.ai/blog/p...)
  2. OpenNews: Google начнёт выплачивать вознаграждения за выявление уязвимостей в гипервизоре KVM
  3. OpenNews: Google расширил программу стимулирования выявления уязвимостей в ядре Linux
  4. OpenNews: Уязвимость в Python, проявляющаяся при обработке непроверенных дробных чисел в ctypes
  5. OpenNews: Уязвимость в Python, позволяющая вызвать системные команды из изолированных скриптов
  6. OpenNews: Универсальный способ DoS-атаки, затрагивающий PHP, Java, Ruby, Python и различные web-платформы
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/63669-python
Ключевые слова: python
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (47) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Аноним (1), 09:03, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +6 +/
    Давайте встроим в язык управление пакетами, это ж так удобно!
     
     
  • 2.2, Аноним (2), 09:13, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Главное в современном безопасном языке - автоматическое освобождение памяти, а то программисты забывают это делать.
     
     
  • 3.8, Аноним (8), 09:42, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Потом будут забывать, какой знак сравнения ставить (так-то было уже), плюс или минус между числами, забывать проверку входных данных, паролей, ключей...
     
     
  • 4.10, Аноним (10), 09:45, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Раньше было лучше... Раньше было лучше... Во, теперь збс!
     
  • 4.32, Аноним (32), 12:38, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Менеджер паролей встроим в интепретатор. Пэтому никто не забудет.
     
  • 4.40, Аноним (2), 12:56, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    ИИ решит обозначенные проблемы.
     
  • 2.7, 12yoexpert (ok), 09:41, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    # cat /etc/portage/package.mask/pip
    dev-python/pip
     
  • 2.36, Аноним (36), 12:49, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Давайте встроим в язык управление пакетами, это ж так удобно!

    Причем здесь управление пакетами? Ты вообще не понял, о чем шла речь.

    Господи, и плюстки же этому комментарию ставят... 🤦 Опеннет не меняется.

     
  • 2.42, Аноним (42), 13:21, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Давайте встроим в язык управление пакетами

    Не в язык и не управление пакетами, а очень удобную фичу. Как получить один исполняемый файл, чтобы можно было его закинуть куда-нибудь в .local/bin и пользоваться? Можно, конечно, все настрочить в один файл на пару тысяч строк, но то такое себе. А тут - зипанул папку с полноценным пакетом, подкинул в ЗИП шибанг, поставил +x и дело в шляпе.

     
     
  • 3.44, Аноним (36), 13:28, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Сорян, но чтобы это понять надо, во-первых, быть знакомым с Питоном и, во-вторых, читать новость. А судя по плюсикам к исходному комментарию, среднестатистический опеннетный эксперт не силен ни в первом, ни во втором.

    Зато увидели знакомые слова и навалили экспертизы.

     

  • 1.3, Аноним (8), 09:21, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В своё время бесил питон блендера, который ещё и залазил в манагер пакетов для определения последнего установленного питона.
     
     
  • 2.4, Аноним (4), 09:25, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Не нравится - создай свой язык программирования.
     
     
  • 3.9, Аноним (8), 09:44, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Да и вообще запретить багрепорты! Не нравится - пиши сам!
     
     
  • 4.14, Аноним (14), 10:12, 03/08/2025 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 5.24, Аноним (24), 12:03, 03/08/2025 Скрыто ботом-модератором     [к модератору]
  • –2 +/
     

  • 1.5, Аноним (4), 09:28, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Python самый лучший язык программирования.
    Это вам не тысяча глаз, а миллионы глаз!
     
     
  • 2.12, Аноним (12), 09:54, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Одно выравние пробелами чего стоит. Простой мёрж веток случайно может всё поломать. То есть язык не предназначен для активной разработки большой (больше 2-3 разработчиков) командой.
     
     
  • 3.13, Аноним (14), 10:09, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Доля рынка - вещью упрямая!
     
     
  • 4.19, Аноним (19), 11:05, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Скорее "лень - двигатель прогресса"
     
  • 3.22, Аноним (22), 11:25, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Проблемы с отступами признак спагетти кода
     
  • 3.29, User (??), 12:29, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Ох уж эти рассказы о совместной разработке на python'е от тех, кто ни совместной разработкой, ни python'ом отродясь не пользовался...
    Копипасти со stackoverflow аккуратней и всё у тебя получится - даже офис-менеджеры уже освоили, один ты всё страдаешь.
     
     
  • 4.39, Аноним (2), 12:55, 03/08/2025 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
  • 3.33, Аноним (32), 12:43, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Но серьёзный(?) компилируемый Nim тоже выбрал пробелы.
     
  • 2.21, Фрол (?), 11:18, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Это вам не тысяча глаз, а миллионы глаз!

    ...вытекших

     
  • 2.26, Аноним (26), 12:10, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Миллионы мух не могут ошибаться.
     
     
  • 3.41, Anonim (??), 13:11, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Про это не скажу, но точно знаю, что некоторые анонимы опеннета всегда правы.
     

  • 1.6, 12yoexpert (ok), 09:38, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    бред для олимпиадников головного мозга
     
     
  • 2.45, Аноним (45), 13:29, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    ждем рекомендаций от оваспа, фильтруйте входные данные в комментариях :)
     

  • 1.11, Аноним (8), 09:47, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    Какой ужас! Хакнуть код, который ты можешь редактировать!
     
  • 1.15, Юзер Минта (?), 10:22, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Интересно, как именно собираются исправлять это теперь
     
     
  • 2.27, Аноним (8), 12:15, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Запретить комментарии и вообще брейнфакинт-синтаксис в языках.
     
  • 2.35, Аноним (35), 12:48, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Для начала нужно запретить новые регистрации с inbox.ru, а дальше надо думать что делать.
     
  • 2.38, Аноним (36), 12:53, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Интересно, как именно собираются исправлять это теперь

    Это буквально "хакер и солонка", что там исправлять? Написано же, что у "атакующего" должна быть возможность редактирования компентариев в атакуемом коде.

     

  • 1.16, Аноним (16), 10:28, 03/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    Самое ужасное во всём это то, что автор вайбкодил:

    > In general, AI has helped me a lot in this CTF.
    > ...I think we will see a new era of AI-assisted security engineering.

     
     
  • 2.17, Аноним (14), 10:41, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +7 +/
    >"автор вайбкодил"

    Ну если программисты годами хвастались своей ЗП и условиями труда, не удивительно что ломанулись "войти в IT" - снизив таким образом ЗП до прожиточного минимума.

     
     
  • 3.23, Маняним1 (?), 11:34, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Тут недавно один стартап, перенасыщенный эффективными менеджерами, поувольнял большую часть разработчиков выплатив им компенсации и пр., даже несчастных джунов и набрал колдунов общающихся со сверхразумом - ИИ. Менеджеры рассчитали экономию в $40 млн. на инструментах которым доверяет рынок, но внезапно разработка встала колом и пришлось возвращать всех взад, даже несчастных джунов, не получив экономии, а получив убыток в $17млн.
     
     
  • 4.46, Аноним (36), 13:31, 03/08/2025 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 2.18, Аноним (18), 10:49, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    > Самое ужасное во всём это то, что автор вайбкодил:

    Боже, надеюсь дети этого не видели.

     
     
  • 3.34, Аноним (32), 12:45, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Теперь скриптодети будут вайбкиддить.
     
  • 2.20, Fracta1L (ok), 11:16, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Что ужасного?
     
     
  • 3.30, Аноним (8), 12:33, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Что ужасного в том, что хирургами будут философы, сверяющие во время операции твои кишки с картинками из интернета, обработанными ИИ?
     
     
  • 4.31, Fracta1L (ok), 12:36, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Принимай таблетки вовремя
     
  • 4.43, Аноним (36), 13:24, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Что ужасного в том, что хирургами будут философы

    Очередной мастер аналогий 🤦. Тебе задали конкретный вопрос в контексте конкретного случая, а ты вместо ответа несешь какой то выдуманный абсурдный бред.

     
     
  • 5.47, Аноним (45), 13:32, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > какой то выдуманный абсурдный бред

    а твой комент не такой же "выдуманный абсурдный бред"? или ты конкретно ответил на вопрос " Что ужасного в том, что хирургами будут философы"?

     
  • 2.25, Аноним (25), 12:05, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Вот интересно кто им платит чтобы на каждый чих прославлять ИИ.
     
     
  • 3.28, Fracta1L (ok), 12:26, 03/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Луддиты платят своими смешными корчами)
     

  • 1.37, Аноним (37), 12:52, 03/08/2025 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2025 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру