JavaScript «заразил» Python хитрой уязвимостью, от которой годами страдает сам
В Python нашелся недостаток Class Pollution, по своим свойствам напоминающий брешь Prototype Pollution в JavaScript. Обнаруживший его эксперт называет его уязвимостью. В случае Prototype Pollution это целый класс уязвимостей, примеры эксплуатации которых с возможными последствиями эксперты рассматривают регулярно. Использовать Class Pollution в корыстных целях, как показала практика, тоже можно.
«Подарочек» от JavaScript
В языке программирования Python, на протяжении полутора лет являющемся самым популярным в мире, обнаружился изъян, получивший название Class Pollution («загрязнение класса» – англ.). Его выявил исследователь в области кибербезопасности Абдулрахим Халед (Abdulraheem Khaled), публикующийся в интернете под псевдонимом Abdulrah33m. Он называет Class Pollution уязвимостью.
Обнаруженную им проблему Халед во всех деталях описал в своем личном блоге, который, судя по его отсутствию в нем других статей на момент выхода материала, завел специально для этого. Халед утверждает, что занимается информационной безопасностью с 16 лет.
По словам исследователя, «дыра» в Python очень схожа по своим свойствам с брешью в языке программирования JavaScript, который не стоит путать с Java. В нем она носит название Prototype Pollution («загрязнение прототипа» – англ.).
Языки разные, проблема одна
В своей публикации Халед несколько раз подчеркнул, что уязвимости типа Pollution – обычное дело для JavaScript, в котором они встречаются довольно часто из-за особенностей самого языка. В то же время в языках на основе классов их, наоборот, почти нет.
Это и делает случай с Class Pollution в Python столь особенным, так как он относится именно к языкам на основе классов. По словам Abdulrah33m, при должной сноровке и опыте в программировании можно «загрязнить», в целом, любой родительский класс в Python, чем вполне могут воспользоваться злоумышленники.
Заявление Abdulrah33m относительно новой уязвимости в Python подтвердили и специалисты портала HackTricks, который тоже в некоторой степени связан с кибербезопасностью. Они опубликовали в свободном доступе несколько примеров успешного использования бреши. В блоге самого Abdulrah33m тоже есть примеры эксплуатации уязвимости с не самыми благими намерениями.
Неутешительные выводы
Природу возникновения уязвимости Class Pollution в Python еще предстоит изучить. На момент выхода материала известно о ней было немного.
В частности, нет данных, когда она была привнесена в язык, и кто ответственен за это. Python существует с конца 1980-х годов и стремительно развивается силами очень активного мирового сообщества.
Нельзя исключать, что брешь Class Pollution появилась в Python много лет назад, и что все эти годы о ее существовании никто не знал, кроме автора, или что она была внедрена случайно и без злого умысла. Нечто подобное в истории Python уже происходило.
Например, не далее чем в сентябре 2022 г. в коде Python нашлась гигантская «дыра», которая впервые появилась в нем еще в 2007 г. Она спокойно просуществовала все эти 15 лет, хотя разработчики прекрасно знали о ней. Но они не стали устранять ее, ограничившись лишь предупреждением в документации к Python, а через некоторое время и вовсе забыли о ней.
Осенью 2022 г. информация об этой уязвимости всплыла вновь. Халатность разработчиков привела к тому, что пострадало как минимум 350 тыс. репозиториев с открытым исходным кодом. Как много программ с закрытыми исходниками содержат эту брешь, остается загадкой.
То же может произойти и с находкой Абдулрахима Халеда. Сам эксперт не сомневается, что уязвимость Class Pollution – это проблема далеко не только Python. «Гибкость, предлагаемая некоторыми языками, например Python, делает различия между моделями наследования на основе прототипов и классов неразличимыми. Следовательно, мы могли бы воспроизвести Prototype Pollution в других языках программирования, даже в тех, которые используют наследование на основе классов», – написал исследователь в своем блоге. Он добавил также, что уязвимостью Class Pollution вполне могут быть заражены все программы, когда-либо написанные на Python.
Проблемы JavaScript
Язык JavaScript существует и развивается с 1997 г. За эти 26 лет одним из его достижений стало попадание в топ-10 авторитетного рейтинга самых востребованных языков программирования компании Tiobe.
За все годы существования рейтинга JavaScript не опускался в нем ниже 14 строчки. В январе 2023 г. он был на седьмом месте, что является почти рекордом для него – лишь единожды, в феврале 2009 г. он поднимался выше, на шестую позицию.
В этом же рейтинге Python очень долго и очень крепко удерживает первое место. Но JavaScript тоже востребован на рынке – CNews писал, что в некоторых странах программистов даже не принимают на работу, если у них нет опыта написания программ на JavaScript.
Судя по всему, Prototype Pollution – это давняя и трудноустранимая проблема JavaScript. В интернете Prototype Pollution описывается не как одна брешь, а как целый класс уязвимостей. Эксперты, в том числе и российские, приводят массу примеров их эксплуатации.