LINUX.ORG.RU

Уязвимость в Rust-библиотеках для формата TAR, приводящая к распаковке файлов из вложенного архива

 , ,

Уязвимость в Rust-библиотеках для формата TAR, приводящая к распаковке файлов из вложенного архива

0

7

В написанной на языке Rust библиотеке async-tar, предоставляющей функции для чтения и записи tar-архивов, выявлена уязвимость (CVE-2025-62518, кодовое имя TARmageddon), позволяющая при распаковке специально оформленного tar-архива не только извлечь размещённые в нём файлы, но и файлы, содержащиеся во вложенном tar-архиве. Уязвимость может быть использована для обхода систем верификации архивов и распаковки файлов, для которых не выполнялась проверка.

Уязвимость также проявляется в форках библиотеки async-tar, таких как tokio-tar, krata-tokio-tar и astral-tokio-tar, а также в утилитах на их основе, например, в пакетном менеджере uv, развиваемом в качестве высокопроизводительной замены «pip» для проектов на языке Python. Из популярных проектов, использующих уязвимые библиотеки, также отмечаются инструментарий testcontainers для запуска docker-контейнеров и WebAssembly runtime wasmCloud. В репозитории crates.is за последние 90 дней библиотека async-tar насчитывает 1.3 млн загрузок, tokio-tar - 2.2 млн, testcontainers - 2.9 млн.

Уязвимость вызвана некорректным выбором позиции при разборе разных значений размера в заголовках ustar и PAX. В tar-архивах в формате PAX для каждого файла внутри архива указываются два заголовка - классический ustar и расширенный PAX. Проблема вызвана тем, что уязвимые библиотеки при распаковке файлов вместо вычисления смещения на основе размера из расширенного заголовка PAX, брали размер из устаревшего заголовка ustar. При нулевом значении размера в заголовке ustar, идущее за ним содержимое файла обрабатывалось как корректный блок TAR-заголовков для следующего файла.

Для совершения атаки достаточно создать TAR-архив, в котором в ustar-заголовке указан нулевой размер, а в заголовке для формата PAX актуальный размер, из-за чего содержимое файла с другим tar-архивом будет обработано как часть основного архива. Пример кода для создания подобных архивов размещён на GitHub. Уязвимость устранена в выпусках tokio-tar 0.5.6 и uv 0.9.5. Для остальных библиотек исправления пока не опубликованы, но для astral-tokio-tar, async-tar и krata-tokio-tar отдельно подготовлены патчи.

Уязвимости в библиотеках присвоен уровень опасности 8.1 из 10, так как проблема может использоваться для перезаписи распаковываемых файлов (в уязвимых реализациях будут распакованы не те файлы, что были видны в архиве). При этом уязвимость в пакетном менеджере uv отмечена как неопасная, так как если атакующий может влиять на содержимое исходного архива, нет смысла усложнять атаку и эксплуатировать уязвимость через вложенный архив, когда можно добиться выполнения кода через сборочные сценарии в основном архиве.

Выявившие уязвимость исследователи предложили несколько гипотетических сценариев атак, позволяющих обойти проверки безопасности и добиться выполнения кода через замену файлов конфигурации или вмешательство в сборочный процесс. Подразумевается, что присланный архив сможет пройти автоматизированную проверку сканером безопасности и ручной аудит, в ходе которого проверяющий не обратит внимание на странный вложенный архив с другими файлами, после чего при распаковке при помощи Rust-библиотек из архива будет извлечено иное содержимое, чем ожидалось.

Например, атакующий может загрузить модифицированный архив в репозиторий PyPI, который пройдёт проверку на основе анализа содержимого основного архива, содержащего легитимный файл pyproject.toml. При обработке данного пакета при помощи утилиты uv легитимный pyproject.toml будет заменён на вредоносный вариант из вложенного архива, содержащий команды, которые будут выполнены при сборке на компьютере разработчика или в системе непрерывной интеграции. Аналогично, можно организовать перезапись файлов контейнера при извлечении образа контейнера при помощи инструментария testcontainers.

>>> Подробности на OpenNET

★★★★★

Проверено: dataman ()
Последнее исправление: dataman (всего исправлений: 2)
Ответ на: комментарий от mx__

Мда… система контроля качества на нуле. Каждый unwrap с лупой проверяется на код-ревью. Пользоваться им в функции, которая уже имеет тип Result - огромная нелепость, достаточно поставить знак вопроса, и уже сэкономишь символы и возможную головную боль.

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

unC0Rr ★★★★★
()
Последнее исправление: unC0Rr (всего исправлений: 1)
Ответ на: комментарий от mx__

А ну то есть мы «решили» одну группу проблем в Rust, но добавили другую группу. И получается хотели уйти от overqualified специалистов снизив затраты на разработку, но увы.

Ygor ★★★★★
() автор топика
Ответ на: комментарий от Ygor

В смысле? Вы синтаксис раста видели? Тут наоборот по моему, чтобы спецом по Расту быть нужен уровень ого-го какой.

mx__ ★★★★★
()
Ответ на: комментарий от mx__

В смысле? Вы синтаксис раста видели? Тут наоборот по моему, чтобы спецом по Расту быть нужен уровень ого-го какой.

Наверное расчет был на нейросети.

Ygor ★★★★★
() автор топика
Ответ на: комментарий от Somebody

Тогда что-нибудь «вменяемое» для уже достаточно «старых» на рынке PIC контроллеров от Microchip посоветуйте, пожалуйста.

rust будет везде! Я вот сейчас хобочусь тут: https://aya-rs.dev/

Eulenspiegel
()
Ответ на: комментарий от Eulenspiegel

да. Он так и сделан - для норм спецов.

Не, слово нормальных тут не подходит - я бы сказал крутых спецов !

mx__ ★★★★★
()
Ответ на: комментарий от Eulenspiegel

перепевы 40 лет назад написанных unix-утилит.

0.0.2 servo

инторнет этот ваш лёг потому что в этом прекрасном языке assert’ы работают всегда, а не только в дебаге

для норм спецов.

А где критерий кто норм? Типа пузырьковую сортировку выучил уже норм?

Ygor ★★★★★
() автор топика
Ответ на: комментарий от Eulenspiegel

Lisp

А какая там парадигма: ехал список, через список, список, список, список?

Ygor ★★★★★
() автор топика
Ответ на: комментарий от Ygor

мультипарадигма, глубокое знакомство с несколькими ЯП.

Haskell/Rust:
pure func/IO vs safe/unsafe
pattern matching vs pattern matching
ADT vs ADT
monads:
– Haskell
processData :: NonEmpty Int -> Maybe Result
– Rust
fn process_data(data: NonEmpty) -> Option {
Система макросов (да, не лисп, но слава Богу и не С)
high order func vs high order func (map, filter etc)
GC vs owner/borrow (чего в Haskell и не будет)

и на блюдце:
Wasm
FFI
etc

Получаем ЯП для спецов, которые пишут не hello, world…

Eulenspiegel
()
Последнее исправление: Eulenspiegel (всего исправлений: 2)
Ответ на: комментарий от Ygor

перепевы 40 лет назад написанных unix-утилит.

Glibc - говнина. Musl - меньше. Так что да ))

Eulenspiegel
()
Ответ на: комментарий от Eulenspiegel

Да и шёл бы он... и оставался бы... в этой вашей везде... :)

Somebody ★★★★
()
Ответ на: комментарий от mx__

«чОтА ржу!..» ©

Как говаривала одна умная женщина о подобных «откровениях»: «Сам себя не похвалишь — стоишь, как оплёванный...» ;D

Пока что от «апологетов» Rust одна похвальба....

Somebody ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.
Тема будет перемещена в архив .