| 제목 | bitcoinj <=0.17 SSRF |
|---|
| 설명 | PaymentSession fetches a BIP-70 PaymentRequest from a remote party and later issues an HTTP POST to the URL contained in that message's payment_details.payment_url field.
That URL is attacker-controlled data taken straight off the wire. It is passed to new URL(...) and then url.openConnection() with no scheme allowlist, no host validation, and no private/loopback/link-local address filtering.
The protocol's PKI layer does not mitigate this, for two independent reasons:
The pki_type field is chosen by the sender of the message. Setting pki_type = "none" makes verifyPaymentRequestPki() return null immediately — the entire certificate chain check is skipped. No certificate is required.
Even with a valid x509+sha256 signature, the signature covers serialized_payment_details; it attests who authored the message, not where the URL points. Any party holding any valid certificate can sign a request whose payment_url targets 127.0.0.1.
The victim wallet reaches the vulnerable path while using verifyPki = true, the most secure client configuration available.
|
|---|
| 원천 | ⚠️ https://github.com/bitcoinj/bitcoinj/issues/4386 |
|---|
| 사용자 | ZAST.AI (UID 87884) |
|---|
| 제출 | 2026. 09. 29. AM 09:14 (1 월 ago) |
|---|
| 모더레이션 | 2026. 10. 15. PM 08:08 (16 days later) |
|---|
| 상태 | 수락 |
|---|
| VulDB 항목 | 420761 [bitcoinj 까지 0.17 Payment Request PaymentSession.java url.openConnection pki_type 권한 상승] |
|---|
| 포인트들 | 19 |
|---|