The OpenNET Project / Index page

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



"Уязвимость в Python-модуле TarFile, допускающая запись в любые части ФС"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Изначальное сообщение [ Отслеживать ]

"Уязвимость в Python-модуле TarFile, допускающая запись в любые части ФС"  +/
Сообщение от opennews (??), 05-Июн-25, 23:35 
Во входящем в штатную поставку Python модуле tarfile, предоставляющем функции для чтения и записи tar-архивов, выявлено пять уязвимостей, одной из которых присвоен критический уровень опасности.  Уязвимости устранены в выпусках Python 3.13.4 и 3.12.11. Наиболее опасная уязвимость (CVE-2025-4517) даёт возможность при распаковке специально оформленного архива  записать файлы в любую часть файловой системы. В системных скриптах, использующих tarfile и запускаемых с правами root (например, в утилитах для работы с пакетами и изолированными контейнерами), уязвимость может применяться для повышения своих привилегий или выхода за пределы изолированного контейнера...

Подробнее: https://www.opennet.dev/opennews/art.shtml?num=63365

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения [Сортировка по ответам | RSS]

3. Сообщение от Самый Лучший Гусь (?), 05-Июн-25, 23:39   +1 +/
Уже давно перешли на 3.13. Там новый красивенький РЕПЛ
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #29, #45

4. Сообщение от Аноним (4), 05-Июн-25, 23:58   –13 +/
Сишные проблемы дают о себе знать даже в нормальных языках.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #5, #6, #21

5. Сообщение от aaa (??), 06-Июн-25, 00:12   +/
В коровьем, телячьем или лосином?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #30, #44

6. Сообщение от vdb (?), 06-Июн-25, 00:23   +5 +/
Во-первых, неправильная обработка '..' — это алгоритмическая, а не сишная проблема. Во-вторых, с каких пор питон стал нормальным языком?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4 Ответы: #8, #17

7. Сообщение от Аноним (7), 06-Июн-25, 00:36   +9 +/
> вызвана некорректной обработкой последовательности ".." в имени ссылки.

Старая грабля, но по прежнему исправно #%^шит по лбу всяким нубам.

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #10, #23

8. Сообщение от Аноним (8), 06-Июн-25, 01:06   –4 +/
>неправильная обработка '..' — это алгоритмическая, а не сишная проблема.

Только наполовину. Из-за примитивности си, в нём в качестве путей используются сырые строки, со всеми вытекающими проблемами.

https://ocaml.org/p/eio/1.2/doc/Eio/Stdenv/index.html#val-cwd
>Paths can be absolute or relative (to the current working directory). Using relative paths with this is similar to using them with cwd, except that this will follow ".." and symlinks to other parts of the filesystem.

Это значит, что вручную проверять каждый путь на правильность не нужно.

Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)

Данная строка выбросит исключение, так как происходит выход за допустимые границы.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #12, #16, #38

9. Сообщение от Аноним (12), 06-Июн-25, 01:21   +/
Так ведь это нормальное поведение tar архивов, что путь можно любой указать. И как конкретно оно сбегает из "контейнеров"? Подразумевается питоновская бурная деятельность с venv вместо неймспесов линукса?
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #14

10. Сообщение от Аноним (10), 06-Июн-25, 01:52   +4 +/
И безо всяких сей.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7

12. Сообщение от Аноним (12), 06-Июн-25, 05:53   +4 +/
Пути как строки принимает любая современная ОС, вы что-то пургу несёте какую-то. Обработать строку и убрать оттуда "/../" - дело максимум 20 строк в цикле.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8

13. Сообщение от Аноним (13), 06-Июн-25, 07:03   +/
Да пофиг. Всё равно этот модуль нужен исключительно для программного доступа к содержимому. Кому распаковывать - те ручками распакуют куда надо.
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #24

14. Сообщение от Аноним (10), 06-Июн-25, 07:28   +1 +/
jail нет, всё остальное пока не дотягивает.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #9

16. Сообщение от YetAnotherOnanym (ok), 06-Июн-25, 07:43   +1 +/
> в качестве путей используются сырые строки

Это сишная проблема?

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8

17. Сообщение от YetAnotherOnanym (ok), 06-Июн-25, 07:47   –4 +/
Нормальным языком питон считают те, кто никаких других языков не знают.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #6 Ответы: #19

19. Сообщение от Аноним (19), 06-Июн-25, 08:00   +2 +/
Доля рынка - вещь упрямая!
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #17 Ответы: #39

21. Сообщение от какая разница (?), 06-Июн-25, 08:42   +2 +/
>  Уязвимости устранены в выпусках Python 3.13.4 и 3.12.11,

но местные "эксперты" по старой памяти во всем винили Си..

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #4

23. Сообщение от User (??), 06-Июн-25, 09:24   +/
Да вот если бы "нубам"... Оно ВСЕМ нет-нет да и "да".
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #7

24. Сообщение от 1 (??), 06-Июн-25, 09:56   +/
А потом, какой-нибодь Sony программист, поставит лишний пробел в скрипте обновления ....
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #13

25. Сообщение от Аноним (25), 06-Июн-25, 10:01   +/
Странно что выпустили фикс только для 3.12 и 3.13. Или в ранних версиях нет такого модуля?
Ответить | Правка | Наверх | Cообщить модератору
Ответы: #34, #47

26. Сообщение от Аноним (8), 06-Июн-25, 10:40   +/
Чёт бот скрывает все сообщения подряд.
>Пути как строки принимает любая современная ОС, вы что-то пургу несёте какую-то. Обработать строку и убрать оттуда "/../" - дело максимум 20 строк в цикле.

Оно всё дело 20 строк. Хоть подсчёта длины массива, как в эпичном баге grub с 28 backspace, хоть в sql запросах экранировать переменные, хоть здесь. Если программист этого не помнит, а такое частенько случается, то вопрос в том, напомнит ли ему об этом хоть кто-то или нет. В языках типа си, программисту никто ничего никогда не напомнит, все баги будут исключительно на его совести. В языках типа окамла, программисту специально ставят определённые заграждения, чтобы даже если он что-то забудет, то произойдёт ошибка компиляции, где программисту напомнят об этом. Это как со станками, когда вначале в станок ставят деталь, а потом, работник двумя руками нажимает на предохранители. Потому, что деталей много, может кто-то куда-то спешит, а вот запасных рук у работника нет. И такой подход позволяет выражать свои намерения явно: нужен ли доступ сразу ко всей файловой системе, или какой-то части.

Ответить | Правка | Наверх | Cообщить модератору
Ответы: #27

27. Сообщение от User (??), 06-Июн-25, 12:24   +/
Нуээээ... в "нормальных" языках - что бы там не могла обработать на входе сама ОС - "нормальный" программист будет работать не со "строками", а со специально предназначенными для работы с путями "объектами", которые - да-да, хорошо так снижают возможности выстрелить себе в ногу.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #26 Ответы: #35

29. Сообщение от Аноним (29), 06-Июн-25, 12:27   +3 +/
Новость, как бы, намекает, что в 3.13.3 тоже имеется.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3

30. Сообщение от Аноним (29), 06-Июн-25, 12:28   +/
Комодского варана.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5

34. Сообщение от userd (ok), 06-Июн-25, 13:25   +/
Модуль tarfile появился в Python 2.3.

TarFile.extract()/TarFile.extractall() позволяют при распаковке заменить любой доступный файл - по абсолютному пути или по относительному вне текущего директория.

Когда-то консольный tar тоже это позволял, но потом была осознана опасность tarbomb и консольные tar-ы прикрыли ключиками (-P, --absolute-paths).

В версии 3.10 у методов extract/extractall появился параметр filter, который должен давать возможность управлять разрешением на извлечение файлов в сомнительных случаях. Вот это управление оказалось повреждено в 3.12. О чём, собственно, и новость.


Ответить | Правка | Наверх | Cообщить модератору
Родитель: #25

35. Сообщение от Александр (??), 06-Июн-25, 13:47   +/
Никакой язык не избавит от такого бага. тут уже плоскость логики: в случае А тебе нужно подняться наверх по каталогам, а в случае Б - нет. Чем язык поможет?
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #27 Ответы: #36

36. Сообщение от Аноним (8), 06-Июн-25, 13:55   +/
Выше пример

Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)

Бросит исключение, так как подниматься выше cwd запрещено.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #35 Ответы: #37, #40

37. Сообщение от Аноним (12), 06-Июн-25, 14:23   +/
Скипну с вашего позволения аналогию напечатать 20 строк кода, которые всегда можно переписать заного, и ногами в станке.
Ваш пример:

> Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)

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

> static int sanitize_path_cwdonly(char *buf /* modify inplace */);

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #36 Ответы: #41, #46

38. Сообщение от Аноним (-), 06-Июн-25, 14:41   +/
> Eio.Path.((Eio.Stdenv.cwd env) / ".." |> read_dir)

С такими рунами остальное будет совершенно не важно ибо если проект девелопаете только вы - его проблемы только вам и интересны.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #8 Ответы: #43

39. Сообщение от Аноним (12), 06-Июн-25, 15:11   +/
ООПшники, которые вместо написания полезного кода наклепали сотни тысяч обёрток вокруг кода, который реально что-то делает - стадо упрямое. Без этой секты инкапсуляции в школе можно было бы человека сразу на bash учить программировать - там заодно и проблем никаких с типами не было бы, всё есть строка и всё читает буквы.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #19

40. Сообщение от Аноним (-), 06-Июн-25, 17:36   +/
Это не решение проблемы. Решением будет запрет использовать API открытия файлов стандартной библиотеки, и предоставление альтернативного API, который будет проверять пути. За попытки использовать стандартную библиотеку расстреливать на месте. Можно скрипт написать, который будет проверять коммиты на наличие вызовов функций стандартной библиотеки, реджектить эти коммиты и вызывать расстрельную команду.

Довольно просто с организационной точки зрения. Но язык тут ни при чём.

Кстати, твой пример не спасает, например, от симлинков, которые могут выводить за пределы того дерева файлов, которым ты хочешь ограничить свою программу.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #36 Ответы: #42

41. Сообщение от Аноним (8), 06-Июн-25, 17:51   +/
>это просто тот же самый фильтр в стрингбилдере, который просто за вас кто-то написал.

Нет. read_dir не примет в качестве аргумента строку, будет ошибка компиляции. А дальше, предполагается, что человек пойдёт в документацию, и выяснит, как это сделать правильно.
> static int sanitize_path_cwdonly(char *buf /* modify inplace */);

Знаете, в чём проблема вашего кода? Это просто объявление функции, без тела. Языку си уже больше полувека, а вы до сих пор приводите гипотетическое решение, а не ссылку на хотя-бы сколь нибудь популярную сишную библиотеку. И никаких намёков, что это решение будет хоть в каком-то виде, хотя-бы когда-то.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #37

42. Сообщение от Аноним (8), 06-Июн-25, 18:01   +/
>Решением будет запрет использовать API открытия файлов стандартной библиотеки

Ну что вы так с козырей то заходите? Если использовать линтер, то и раст внезапно не нужен, так как проверка владения может быть на стороне линтера. Но есть одна проблема: сишники являются идеологическими противниками любых линтеров, а ещё, они изобретают велосипеды. Так что удачи хотя-бы одного сишника уболтать на это.
>Кстати, твой пример не спасает, например, от симлинков

Разумеется, вы не правы, я это проверил. Поскольку в окамле принято использовать библиотеки, а не велосипедить каждый раз, то данный случай в библиотеке учтён. Что опять таки выгодно отличает окамл от си.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #40

43. Сообщение от Аноним (8), 06-Июн-25, 19:08   +/
>С такими рунами

Щито поделать, десу. Ну вот не завезли в мейнстрим ничего похожего.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #38

44. Сообщение от Ustas (??), 06-Июн-25, 19:12   +/
А что не так - телячий язык под брусничным соусом это что-то…
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #5

45. Сообщение от Аноним (45), 06-Июн-25, 19:59   +/
РЕПЛ — это в лиспах. Больше нигде не видел даже отдалённо напоминающего. Все попытки создать подобное в других языках выгдядят как детская поделка из пластилина и желудей, и имеет чуть большую полезность.
Ответить | Правка | Наверх | Cообщить модератору
Родитель: #3

46. Сообщение от Аноним (-), 06-Июн-25, 21:01   +/
> static int sanitize_path_cwdonly(char *buf /* modify inplace */);

И как это будет работать? Допустим в пути симлинк, и когда это санитайзер будет вычислять канонический путь от корня, он получит более длинную строку, чем размер буфера, который он кстати даже не знает. Что ему делать в такой ситуации?

Ты мыслишь так, как мыслили диды в 80-х годах. И с таким мышлением, у тебя код вечно будет в багах. Причём и санитизировать пути тебе не удастся полностью, и с памятью работать корректно тоже, потому что пытаясь решить первую проблему, ты начинаешь рыть себе яму второй проблемы.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #37

47. Сообщение от Аноним (47), 06-Июн-25, 22:07   +/
> Или в ранних версиях нет такого модуля?

Ранние версии не поддерживаются, и исправлять там ничего не будут. Не можете обновиться на актуальный питон - вас поломают, и поделом.

Ответить | Правка | Наверх | Cообщить модератору
Родитель: #25


Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




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

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