Публикуван е метод за заобикаляне на системи за изолирано изпълнение на код на Python, базиран на използването на добре позната грешка, открита в Python 2.7 през 2012 година и все още не поправена в Python 3. Грешката позволява чрез специално подготвен код на Python да се инициира достъп до вече освободена памет (Use-After-Free) в CPython. Първоначално се предполага, че грешката не представлява заплаха за сигурността и само в много редки случаи, обикновено изкуствено създадени, може да доведе до аварийно спиране на скрипта.
Изследовател на сигурността с псевдоним kn32 прояви интерес към проблема и успя да подготви работещ експлойт, който позволява извикването на всяка системна команда, без необходимост от пряк достъп до методи от вида os.system. Експлойтът е реализиран на чист Python и работи без внос на външни библиотеки и без инсталиране на обработчик „code.__new__“. Използва се само „builtin.__id__“, който обикновено не е забранен. От практическа гледна точка, предложеното решение може да се прилага за заобикаляне на механизми за изолация в различни услуги и среди (например, в учебни среди, онлайн оболочки, вградени обработващи системи и т.н.), които позволяват изпълнението на код на Python, но ограничаващи достъпните извиквания и не позволяващи достъп до методи като os.system.
Предложеното решение представлява аналог на извикването на os.system, работещо чрез експлоатиране на уязвимост в CPython. Експлойтът работи с всички версии на Python 3 на системи с архитектура x86-64 и демонстрира стабилност в Ubuntu 22.04, дори при активирани режими на защита PIE, RELRO и CET. Работата е сведена до получаване на информация от кода на Python за адреса на една от функциите в изпълнявания код на CPython. На базата на този адрес се изчислява основният адрес на CPython в паметта и адресът на функцията system() в заредения в паметта екземпляр на libc. Накрая се инициира директен преход към определен адрес system с подмяна на указателя на първия аргумент на низ „\/bin\/sh“.

Източник: opennet.ru
