Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-65320-fastcore — Документирует CVE-2026-65320, обход пути типа tar-slip в функции untar_dir() библиотеки fastcore, с безвредным proof-of-concept, демонстрирующим произвольную запись файлов и выполнение кода. | Kitploit
Инструменты/GitHubGitHub/rahulreddykarne/cve-2026-65320-fastcore
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийСтатьи и ИсследованияОбучение и Образование
GitHubrahulreddykarne/cve-2026-65320-fastcore

CVE-2026-65320-fastcore

Документирует CVE-2026-65320, обход пути типа tar-slip в функции untar_dir() библиотеки fastcore, с безвредным proof-of-concept, демонстрирующим произвольную запись файлов и выполнение кода.

Репозиторий
1 день назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

CVE-2026-65320: Обход пути (Tar Slip) в fastcore через untar_dir()

Критичность: Критическая, CVSS 3.1 9.8

Вектор (v3.1): CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Затронуто: fastcore <= 2.2.30

Исправлено в: Не исправлено на момент написания

CWE: CWE-22 (Некорректное ограничение пути к каталогу, 'Обход пути')

Компонент: fastcore.xtras.untar_dir() → fastcore.xtras._unpack() → shutil.unpack_archive()

Среда выполнения с высоким риском: Python < 3.14 (в Python 3.14 безопасный фильтр tar data используется по умолчанию)

Обнаружил: Rahul Karne

CNA: VulnCheck


Краткое описание

fastcore.xtras.untar_dir(fname, dest) — это документированный вспомогательный метод, который распаковывает архив "в dest".

Внутри он передаёт архив стандартной библиотечной функции shutil.unpack_archive() без фильтра извлечения, без проверки путей членов архива и без какой-либо проверки нахождения за пределами после извлечения.

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

Вызывающая сторона, которая обоснованно ожидает, что untar_dir(fname, dest) ограничит всё каталогом dest, вместо этого получает произвольную запись файлов в любом месте, куда процесс имеет право записи.


Влияние

Произвольная запись файлов с правами процесса, вызывающего untar_dir().

В зависимости от того, что перезаписывается, это может привести к:

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

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


Охват

fastcore — это фундаментальная зависимость во всей экосистеме fast.ai, включая:

  • fastai
  • nbdev
  • ghapi
  • Другие связанные пакеты

Он получает десятки миллионов загрузок в месяц.

untar_dir() — это примитив извлечения, лежащий в основе распространённого рабочего процесса "скачать архив, затем распаковать его", который следует той же общей схеме, что и untar_data в fastai.

Любой путь кода, который передаёт untar_dir() архив, содержимое которого не является полностью доверенным, подвержен уязвимости.


Технические детали

Уязвимый код находится в fastcore/xtras.py:

root@kitploit:~
def _unpack(fname, out):
    import shutil
    shutil.unpack_archive(str(fname), str(out))   # <-- no filter, no validation
    ls = out.ls()
    return ls[0] if len(ls) == 1 else out


def untar_dir(fname, dest, rename=False, overwrite=False, uid=-1, gid=-1):
    "untar `file` into `dest` ..."
    import tempfile, shutil
    dest = Path(dest)

    with tempfile.TemporaryDirectory() as d:
        out = Path(d) / remove_suffix(Path(fname).stem, '.tar')
        out.mkdir()

        ...

        src = _unpack(fname, out)      # extraction escapes `out` here

        ...

        shutil.move(str(src), dest)

        ...

        return dest

untar_dir() создаёт внутренний временный каталог для извлечения:

root@kitploit:~
<tempdir>/<random>/<archive-stem>/

Затем он вызывает _unpack(), который напрямую передаёт архив в:

root@kitploit:~
shutil.unpack_archive()

Для TAR-архивов это в конечном итоге вызывает tarfile.extractall().

В Python < 3.14 поведение извлечения по умолчанию — fully_trusted, что означает, что члены с обходом пути могут быть обработаны.

Например, член архива, такой как:

root@kitploit:~
../../../some/other/dir/file

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

Ничто в fastcore:

  • Не передаёт filter="data" там, где это поддерживается.
  • Не отклоняет абсолютные пути.
  • Не отклоняет пути с буквой диска.
  • Не отклоняет UNC-пути.
  • Не отклоняет компоненты пути ...
  • Не отклоняет символьные или жёсткие ссылки.
  • Не проверяет, что каждый извлечённый путь остался под предполагаемым корнем извлечения, прежде чем вернуть успех.

Первопричина

untar_dir() относится к shutil.unpack_archive() так, как будто это безопасный, изолированный распаковщик архивов.

Это не так.

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

fastcore ни передаёт подходящий фильтр извлечения, ни реализует эквивалентную защиту от выхода за пределы для поддерживаемых версий Python.

Он также не предупреждает вызывающих untar_dir() об этом чувствительном к безопасности поведении.


Почему именно путь TAR

Члены TAR могут содержать произвольные строки путей.

В затронутых версиях Python tarfile.extractall() по умолчанию не нейтрализует автоматически последовательности обхода ...

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

Надёжным примитивом является относительный обход, такой как:

root@kitploit:~
../../../target/file

Именно эта техника используется в доказательстве концепции.


Доставка по сети

Опасный ввод — это содержимое архива, а не путь назначения, выбранный разработчиком.

Архивы часто получают из внешних или полу-доверенных источников, включая:

  • Пакеты моделей
  • Архивы наборов данных
  • Пакеты плагинов
  • Артефакты CI/CD
  • Загрузки пользователей
  • Загрузки партнёров
  • Удалённые HTTP-загрузки

Поэтому любой сервис или инструмент, который скачивает архив из недоверенного или полу-доверенного источника и впоследствии обрабатывает его с помощью untar_dir(), может быть достижим.

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


Предусловия эксплуатации

Успешная эксплуатация требует:

  1. Приложение вызывает fastcore.xtras.untar_dir() для архива, содержимое которого находится под влиянием злоумышленника, например загруженного, скачанного или иным образом недоверенного архива.

  2. Среда выполнения использует Python < 3.14 или другую конфигурацию, в которой безопасный фильтр извлечения TAR не применяется.

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

    • Каталог плагинов
    • Импортируемый Python-модуль
    • Хук запуска
    • Другое автоматически загружаемое место

Произвольная запись файлов и изменение конфигурации/данных требуют только условий 1 и 2.


Доказательство концепции

poc_fastcore_cna_demo.py вызывает реальный API fastcore.xtras.untar_dir().

Демонстрация намеренно безвредна.

Каждый файл, созданный PoC, остаётся внутри одного демонстрационного каталога, указанного с помощью:

root@kitploit:~
--demo-root

PoC не изменяет реальные системные файлы и не обращается к облачным сервисам или учётным данным.

Что делает PoC

  1. Выводит сведения об окружении и уязвимый исходный код для _unpack() и untar_dir().

  2. Создаёт демонстрационную структуру, содержащую:

    • Предполагаемый корень извлечения
    • Отдельный каталог приложения:
      root@kitploit:~
      service_app/plugins/
      
  3. Создаёт:

root@kitploit:~
attacker_supplied_upload.tar

содержащий члены архива, предназначенные для указания за пределы предполагаемого корня извлечения, включая члены с обходом пути и:

root@kitploit:~
service_app/plugins/startup_hook.py
  1. Вызывает имитированный обработчик загрузки:
root@kitploit:~
def auto_extract_uploaded_archive(received_archive):
    return untar_dir(
        received_archive,
        intended_root,
        overwrite=True
    )
  1. Проверяет, что файлы были записаны за пределами предполагаемого каталога извлечения.

  2. Имитирует перезагрузку сервиса путём импорта записанного архивом:

root@kitploit:~
startup_hook.py

Безвредный хук запуска создаёт:

root@kitploit:~
SERVICE_RELOAD_MARKER

Это демонстрирует полную цепочку:

root@kitploit:~
Attacker-controlled archive
        ↓
Path traversal during extraction
        ↓
Arbitrary file write
        ↓
Write into importable / auto-loaded location
        ↓
Application loads attacker-controlled file
        ↓
Code execution

Установка

Установите затронутый пакет:

root@kitploit:~
pip install fastcore

Проблема подтверждена на:

root@kitploit:~
fastcore 2.2.30

Демонстрация может работать с:

  • Копией fastcore, установленной через pip
  • Локально распакованным деревом исходников, выбранным с помощью --source

Все записи PoC остаются внутри каталога, указанного через --demo-root.


Запуск

Очистите предыдущий вывод PoC:

root@kitploit:~
python poc_fastcore_cna_demo.py --demo-root ./poc_fastcore --clean

Запустите демонстрацию:

root@kitploit:~
python poc_fastcore_cna_demo.py \
  --demo-root ./poc_fastcore \
  --source latest \
  --no-pause

Ожидаемый вывод

Пример сокращённого вывода:

root@kitploit:~
fastcore version:  2.2.30

Outside marker exists after extraction? True
Is outside marker inside intended extraction root? False

Relative traversal marker exists after extraction? True
Is relative traversal marker inside intended extraction root? False

Service plugin file exists after extraction? True
Service reload marker exists? True

POC WORKED: fastcore extracted attacker-controlled tar members outside the intended root.

Устранение

Для сопровождающих fastcore

1. Используйте безопасную фильтрацию извлечения TAR

В поддерживаемых версиях Python используйте безопасный фильтр извлечения, такой как:

root@kitploit:~
filter="data"

с shutil.unpack_archive() или соответствующей операцией извлечения tarfile.


2. Проверяйте членов архива перед извлечением

Каждый член архива должен быть проверен перед извлечением.

Отклоняйте:

  • Абсолютные пути
  • Пути Windows с буквой диска
  • UNC-пути
  • Пути, содержащие ..
  • Небезопасные символьные ссылки
  • Небезопасные жёсткие ссылки

Цели ссылок также должны быть разрешены и проверены перед извлечением.


3. Обеспечьте ограничение извлечения

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

Концептуально:

root@kitploit:~
resolved_member_path
        ↓
must remain inside
        ↓
resolved_extraction_root

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


4. Добавьте регрессионные тесты

Регрессионные тесты должны охватывать как минимум:

root@kitploit:~
../ traversal
absolute paths
Windows drive-letter paths
UNC paths
symbolic links
hard links

5. Документируйте ожидания по безопасности

Чётко документируйте, предназначен ли untar_dir() для безопасной обработки недоверенных архивов.

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

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


Временные рекомендации для пользователей

До выпуска исправления на уровне пакета:

  • Предпочитайте Python 3.14+, где это применимо.
  • Не передавайте недоверенные архивы напрямую в untar_dir().
  • Проверяйте всех членов архива перед извлечением.
  • Убедитесь, что извлечённые пути не могут выйти за пределы предполагаемого каталога назначения.
  • Рассматривайте удалённо скачанные или предоставленные пользователем архивы как ввод, контролируемый злоумышленником.

Соображения по CVSS

Основной технический дефект — это уязвимость произвольной записи файлов, вызванная обходом пути в архиве.

Однако итоговая критичность зависит от среды развёртывания и того, как untar_dir() доступен.

Сценарий сетевого сервиса

Репрезентативный вектор может приближаться к:

root@kitploit:~
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H

Результат:

root@kitploit:~
9.8 — Critical

Сценарий разработчика / CLI

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

Итоговая оценка CVSS, следовательно, будет существенно ниже.


Оговорки

При оценке проблемы следует учитывать два важных фактора.

Существующий класс уязвимостей

Это экземпляр давно известного класса уязвимостей небезопасного извлечения TAR, связанного с:

root@kitploit:~
CVE-2007-4559

Современные выпуски Python ввели более безопасное поведение извлечения архивов.

Python 3.14 делает безопасный фильтр извлечения data поведением по умолчанию.

Следовательно, основная затронутая среда — Python < 3.14.

Однако эти среды выполнения по-прежнему широко развёрнуты.

Требование недоверенного архива

Уязвимость становится эксплуатируемой, когда вызывающая сторона передаёт untar_dir() архив, содержимое которого контролируется злоумышленником или иным образом недоверенно.

Поэтому этот отчёт рассматривает содержимое архива как недоверенную границу безопасности.

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


Хронология раскрытия

Замените приведённые ниже даты-заполнители фактическими датами раскрытия.

  • YYYY-MM-DD — Уязвимость сообщена сопровождающим.
  • YYYY-MM-DD — Ответ поставщика / подтверждение / отсутствие ответа.
  • 2026-09-26 — Подтверждено, что всё ещё не исправлено в последнем выпуске (2.2.30); код извлечения остался без изменений.

Благодарности

Обнаружено и сообщено Rahul Karne.


Ссылки

  • Документация fastcore untar_dir()
    https://fastcore.fast.ai/xtras.html

  • Исходный код fastcore xtras.py
    https://github.com/AnswerDotAI/fastcore/blob/main/fastcore/xtras.py

  • fastcore на PyPI
    https://pypi.org/project/fastcore/

  • Документация Python shutil.unpack_archive()
    https://docs.python.org/3/library/shutil.html#shutil.unpack_archive

  • Фильтры извлечения Python tarfile
    https://docs.python.org/3/library/tarfile.html#extraction-filters

  • PEP 706 — Фильтр для tarfile.extractall
    https://peps.python.org/pep-0706/

  • CWE-22 — Некорректное ограничение пути к каталогу
    https://cwe.mitre.org/data/definitions/22.html

  • CVE-2007-4559 — Класс уязвимостей небезопасного извлечения TAR
    https://nvd.nist.gov/vuln/detail/CVE-2007-4559


О проекте

Этот репозиторий документирует результат скоординированного раскрытия информации о безопасности и предоставляет безвредное, самодостаточное доказательство концепции.

PoC записывает только внутри каталога --demo-root, указанного пользователем, и не выполняет разрушительных действий.

Любая сетевая функциональность, включённая в демонстрацию, ограничена необязательной локальной демонстрацией.

Этот материал предоставлен для защитных исследований в области безопасности и образовательных целей.


Пресса

Медиа-запросы: [email protected]. Полный PoC (сервер злоумышленника, архив с обходом пути, приложение-жертва) и дополнительные технические детали доступны по запросу.

Скачать инструмент