
сценарий на основе CVE-2022-25845, дающий TP для SCA на основе метаданных, но FN при использовании графа вызовов
Проект содержит зависимость fastjson с уязвимостью CVE-2022-25845.
Уязвимость возникает из-за того, что данные в JSON интерпретируются как Java-бины, т.е. классы инстанцируются, а свойства устанавливаются путём выполнения методов-сеттеров. Это делается с помощью рефлексии. Если в classpath имеется класс, где сеттеры могут инициировать такое поведение, как выполнение кода (в примере это класс Trigger, соответствующий входной файл — CVE-2022-25845.json), то это можно эксплуатировать.
Интересная особенность здесь — использование рефлексии, как показано в приведённом ниже стектрейсе, полученном при запуске прилагаемого теста для демонстрации уязвимости.
setName:11, Trigger
invoke0:-1, NativeMethodAccessorImpl (jdk.internal.reflect)
invoke:62, NativeMethodAccessorImpl (jdk.internal.reflect) [2]
invoke:43, DelegatingMethodAccessorImpl (jdk.internal.reflect)
invoke:566, Method (java.lang.reflect)
setValue:167, FieldDeserializer (com.alibaba.fastjson.parser.deserializer)
deserialze:155, ThrowableDeserializer (com.alibaba.fastjson.parser.deserializer)
parseObject:405, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:1430, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:1390, DefaultJSONParser (com.alibaba.fastjson.parser)
parse:181, JSON (com.alibaba.fastjson)
parse:191, JSON (com.alibaba.fastjson)
parse:147, JSON (com.alibaba.fastjson)
main:18, CheckJSON (scabench)
confirmCVE202225845:39, ConfirmVulnerabilitiesTests (scabench)
Стандартные SCA-инструменты, основанные на метаданных, без труда определяют эту уязвимость — это «обычное дело». Однако инструменты, основанные на графе вызовов, скорее всего пропустят её, поскольку построение графа вызовов, как правило, не моделирует рефлексивные вызовы. В этом смысле это одновременно и истинно-положительный, и ложноотрицательный результат — в зависимости от используемого анализа.
Обратите внимание, что существует тест, подтверждающий уязвимость; этот тест (а следовательно, и сборка с mvn test) завершается неудачей. О том, как работает тест, см. https://github.com/scabench/jsonorg-tp1.
Имеется несколько sh-скриптов для запуска различных анализов, отчёты о результатах можно найти в scan-results.