Что такое атака Tarbomb и как защитить свои приложения на Python?

⚠️ Этот код в этом сообщении предназначен ТОЛЬКО для образовательных целей! Если вы не являетесь владельцем или имеете явное разрешение на тестирование приложения на проникновение, НЕ ИСПОЛЬЗУЙТЕ ЭТОТ КОД ⚠️

Что такое тарбомб?

Tarbomb на самом деле может быть несколькими разными вещами. Одно общее определение похоже на XML-бомбу, которую мы рассматривали ранее, которая расширяется из небольшого файла в очень большой объект в памяти, в этом случае tar-архив содержит много-много файлов, которые при извлечении наводняют файловую систему. Однако на самом деле мы рассмотрим альтернативный тип tarbomb, который может быть немного более опасным, чем просто раздражающим.

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

В качестве примера того, как это может работать, представьте, что вы на своем MacBook пытаетесь открыть файл accounts_2020_06.tar.gz, который вы только что загрузили со своей электронной почты. Ожидается, что из папки загрузок архив будет извлечен в новую папку с именем accounts_2020_06. Однако что, если в архиве есть файл с путем ../.bash_profile и измененная версия профиля bash, открывающая бэкдор в вашей системе? Если понимать буквально, этот вредоносный файл перезапишет ваш действующий профиль bash, и вы даже не узнаете об этом.

К счастью, утилита архивирования macOS и многие другие инструменты распаковки проверяют эти сценарии. Однако не все, в данном случае - tarfile, часть стандартной библиотеки Python, уязвим для этого типа атак при использовании из коробки.

Хотя большинство основных библиотек сжатия zip и tar устранили эту уязвимость с тех пор, как Synk провел дополнительное исследование и опубликовал Zip Slip in 2018, я должен предположить, что все еще существует множество современных и устаревших библиотек и продуктов, уязвимых для этого класса уязвимость.

Создание тарбомба

Создать тарбомб не так уж и сложно. В приведенном ниже примере кода показан простой инструмент, который я собрал для быстрого создания tarbombs для тестирования.

Запуск тарбомба

Как упоминалось ранее, модуль tarfile python уязвим для этой уязвимости. Чтобы активировать уязвимость, вам просто нужно вызвать метод extractall во вредоносном архиве.

Защита

Я не смог найти надежных обходных путей для этого безопасного извлечения после небольшого количества поисковых запросов, поэтому я сделал свою собственную заменяющую библиотеку для tarfile. Мое решение, tarsafe, на самом деле просто подкласса TarFile и добавляет некоторые проверки безопасности.

Tarsafe можно использовать точно так же, как tarfile, но с добавленными в extractall защитами от не только обхода пути через относительный путь, но и символических ссылок / ссылок.

Заключение

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