Tydzień temu - światem Javy - wstrząsnęła informacja o poważnej dziurze bezpieczeństwa w bibliotece do logowania Log4j. Podatność ta pozwalała na wstrzyknięcie na serwery aplikacji kodu dostarczonego przez atakującego.
Problem jest o tyle poważny, iż jest to jedna z dwóch najpopularniejszych bibliotek do logowania obok Logbacka.
Oznacza to, iż szacunkowo problem dotyczy choćby połowy systemu tworzonego w Javie.
Ale jak w ogóle sprawdzić czy jesteśmy zagrożeni?
Zacznijmy od wyjaśnienia, kiedy w ogóle problem nas dotyczy. #
Jesteś zagrożony jeżeli w Twojej aplikacji:
- używasz log4j w wersji
2.0.x
-2.15.0
- masz w zależnościach
org.apache.logging.log4j:log4j-core
. - do Twojej aplikacji można podać wejście od użytkownika
Jeśli:
- nie masz zależności na
log4j-core
, lub.. - używasz log4j w wersji 1.x, lub…
- używasz log4j w wersji 2.16.0 lub…
- na 100% nie logujesz tego, co wysyła do Ciebie użytkownik…
To jesteś bezpieczny :)
Jak więc to sprawdzić?
Jeśli Twój projekt oparty jest o Gradle
, to poniżej pokażę Ci na to 3 sposoby.
Sposób 1 - dependencyInsight #
Bezpośrednio na swoim projekcie wołasz z konsoli komendę
$ gradle dependencyInsight --dependency log4j-core
Jeśli masz aplikację wielomodułową musisz zawołać to zadanie na każdym z modułów.
$ gradle :app:dependencyInsight --dependency log4j-core
$ gradle :background:dependencyInsight --dependency log4j-core
Gdzie app
i background
to nazwy modułów aplikacji.
Jako wynik dostaniesz informacje o tym, czy wciągasz daną bibliotekę do swojej aplikacji i jeżeli tak, to w jakiej wersji.
Sposób 2 - findDependency #
W pliku build.gradle
dodajesz nowe zadanie:
task
findDependency(type:
DependencyInsightReportTask)
{}
Aby odszukać używane w Twoim projekcie wersje log4j
wystarczy teraz zawołać.
$ gw findDependency --configuration compile --dependency log4j
Jeśli masz projekt wielomodułowy opakuj zadanie w dyrektywę allprojects
.
allprojects
{
task
findDependency(type:
DependencyInsightReportTask)
{}
}
Teraz zawołaj komendę jeszcze raz. Tym razem za jednym uruchomieniem dostaniesz wyniki z wszystkich modułów.
Sposób 3 - dependency locking #
Do pliku build.gradle
dodaj:
configurations
{
compileClasspath
{
resolutionStrategy.activateDependencyLocking()
}
runtimeClasspath
{
resolutionStrategy.activateDependencyLocking()
}
}
I zawołaj
$ gradle build --write-locks
-x
test
Ta komenda wygeneruje Ci dla wszystkich z modułów pliki gradle.lockfile
z wersjami zależności, które będzie używał twój projekt.
W tych plikach sprawdź jakie wersje log4j zaciągasz.
Możesz do tego użyć narzędzia ripgrep
.
$ rg 'log4j'
-g
'*.lockfile'
Lub starego, dobrego zwykłego grepa
.
grep
-r
--include
"*.lockfile" log4j .
Podsumowanie #
O ile, mam nadzieję, podatności w swoim serwisie masz już przemigrowane, o tyle nie wiadomo, co przyniesie przyszłość.
Jeśli będziesz jeszcze potrzebować sprawdzić wersje zależności w twoim projekcie możesz użyć jednego z trzech sposobów zaprezentowanych powyżej.