Возможно ли ZipSlip в Java без двух точек?

Вопрос или проблема

Я тестирую Java-приложение, которое пытается предотвратить ZipSlip, просто проверяя, содержит ли имя файла “..” или “./”

Поскольку это не веб-приложение, я полагаю, что кодирование не является вариантом. Как в этом случае может произойти ZipSlip?

Предотвращение восходящей обходной навигации (путем предотвращения распаковки файлов с элементом .. в их пути) является распространенным и достаточным способом для смягчения уязвимостей типа ZipSlip. Это, очевидно, должно быть сделано на версии имени файла, которую приложение передаст файловой системе (или, если приложение канонизирует путь перед передачей его в ОС, на версии пути, который комбинируется с целевым каталогом для получения канонического пути). Таким образом, если происходит какое-либо декодирование, которое должно произойти перед проверкой, но в большинстве случаев это не применимо; путь к файлу хранится внутри zip-архива, а не передается напрямую через HTTP или что-то еще.

Обратите внимание, что этот подход может приводить к ложным срабатываниям. Например, файл под названием “что… это.txt” вызовет тревогу у наивной проверки на “..”, но не содержит его как элемент директории и, следовательно, не вызовет восходящей обходной навигации. Аналогично, путь “foo/bar/../baz.jpg” является безопасным (но сомнительным) эквивалентом “foo/baz.jpg” и не вызовет проблем (если только вы не пытаетесь предотвратить любые подкаталоги, что следует делать, проверяя разделитель директорий вместо этого). С другой стороны, возможно, вам все равно на то, что сайт не допускает странные, но технически безопасные пути к файлам.

Проверка на ./ не имеет большого смысла (хотя проверка на ../ имеет смысл, так как это гораздо более вероятно будет восходящей обходной навигацией). ./ является просто эквивалентом пути файловой системы без операции; это элемент директории, ссылающийся на текущую директорию, а не на родительскую директорию или любую другую.

Ответ или решение

Возможен ли ZipSlip в Java без двух точек?

Введение

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

Понимание уязвимости ZipSlip

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

Проверка на наличие ".." и "./"

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

  1. Использование различных кодировок: Хотя в веб-приложениях кодирование URL может стать проблемой, стоит отметить, что даже в Java приложениях можно столкнуться с другой формой кодирования. Например, использование символов замены или юникодирования (например, .. может быть представлен в виде \u002e\u002e).

  2. Разные символы-разделители: В зависимости от операционной системы или конфигурации окружения, пути могут использовать разные разделители или форматы. Например, некоторые системы могут рассматривать разные символы, такие как / или \\, что может привести к путанице.

  3. Специальные символы: Злоумышленник может использовать специальные символы, чтобы манипулировать путями, например, символы, которые могут указывать на символические ссылки или другие методы обхода стандартных проверок.

  4. Неправильная интерпретация путей: Необходимо понимать, как система обрабатывает относительные пути. Например, фраза foo/bar/.. безопасно разрешается в foo/, но если злоумышленник вводит что-то вроде foo/./bar/?, это может вызвать нежелательное поведение.

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...