Вопрос или проблема
Я тестирую Java-приложение, которое пытается предотвратить ZipSlip, просто проверяя, содержит ли имя файла “..” или “./”
Поскольку это не веб-приложение, я полагаю, что кодирование не является вариантом. Как в этом случае может произойти ZipSlip?
Предотвращение восходящей обходной навигации (путем предотвращения распаковки файлов с элементом ..
в их пути) является распространенным и достаточным способом для смягчения уязвимостей типа ZipSlip. Это, очевидно, должно быть сделано на версии имени файла, которую приложение передаст файловой системе (или, если приложение канонизирует путь перед передачей его в ОС, на версии пути, который комбинируется с целевым каталогом для получения канонического пути). Таким образом, если происходит какое-либо декодирование, которое должно произойти перед проверкой, но в большинстве случаев это не применимо; путь к файлу хранится внутри zip-архива, а не передается напрямую через HTTP или что-то еще.
Обратите внимание, что этот подход может приводить к ложным срабатываниям. Например, файл под названием “что… это.txt” вызовет тревогу у наивной проверки на “..”, но не содержит его как элемент директории и, следовательно, не вызовет восходящей обходной навигации. Аналогично, путь “foo/bar/../baz.jpg” является безопасным (но сомнительным) эквивалентом “foo/baz.jpg” и не вызовет проблем (если только вы не пытаетесь предотвратить любые подкаталоги, что следует делать, проверяя разделитель директорий вместо этого). С другой стороны, возможно, вам все равно на то, что сайт не допускает странные, но технически безопасные пути к файлам.
Проверка на ./
не имеет большого смысла (хотя проверка на ../
имеет смысл, так как это гораздо более вероятно будет восходящей обходной навигацией). ./
является просто эквивалентом пути файловой системы без операции; это элемент директории, ссылающийся на текущую директорию, а не на родительскую директорию или любую другую.
Ответ или решение
Возможен ли ZipSlip в Java без двух точек?
Введение
Вопрос о безопасности при работе с архивами в Java, особенно касающийся уязвимости ZipSlip, стал актуален для многих разработчиков. ZipSlip — это уязвимость, связанная с перераспределением файлов, которая может привести к несанкционированному доступу к файловой системе, даже если в названиях файлов отсутствуют элементы, такие как ".." или "./". В этой статье мы рассмотрим, как возможно столкнуться с ZipSlip, даже если ваше приложение проверяет наличие таких элементов.
Понимание уязвимости ZipSlip
ZipSlip возникает, когда приложение распаковывает файлы из ZIP-архива и не адекватно проверяет пути к файлам, что может привести к тому, что целевые файлы будут размещены вне ожидаемого каталога. Например, злоумышленник может создать ZIP-архив с файлами, которые могут записываться в каталоги непроверяемых уровней, используя хитроумные названия.
Проверка на наличие ".." и "./"
Естественно, логика проверки на наличие ".." кажется логичной, поскольку это основной элемент, указывающий на подъем в структуре каталогов. Однако важно учитывать, что злоумышленник может использовать другие приемы, чтобы обойти эту проверку.
-
Использование различных кодировок: Хотя в веб-приложениях кодирование URL может стать проблемой, стоит отметить, что даже в Java приложениях можно столкнуться с другой формой кодирования. Например, использование символов замены или юникодирования (например,
..
может быть представлен в виде\u002e\u002e
). -
Разные символы-разделители: В зависимости от операционной системы или конфигурации окружения, пути могут использовать разные разделители или форматы. Например, некоторые системы могут рассматривать разные символы, такие как
/
или\\
, что может привести к путанице. -
Специальные символы: Злоумышленник может использовать специальные символы, чтобы манипулировать путями, например, символы, которые могут указывать на символические ссылки или другие методы обхода стандартных проверок.
-
Неправильная интерпретация путей: Необходимо понимать, как система обрабатывает относительные пути. Например, фраза
foo/bar/..
безопасно разрешается вfoo/
, но если злоумышленник вводит что-то вродеfoo/./bar/?
, это может вызвать нежелательное поведение.
Заключение
Несмотря на то, что проверка путей на наличие ".." и "./" является важной мерой предосторожности, она не является достаточной для надежной защиты от уязвимости ZipSlip. Разработчикам необходимо применять более комплексные подходы. Это может включать в себя использование библиотеки для безопасного распаковки архивов, проверку на наличие недопустимых символов и паттернов в файловых путях, а также реализацию строгих правил для целевых директорий.
Безопасность вашего приложения — это не только наличие проверок, но и понимание того, как злоумышленники могут обойти эти проверки использованию тонких манипуляций. Всегда стоит помнить: защитная система не должна полагаться на простые проверки, её необходимо постоянно улучшать и адаптировать к новым угрозам.