
Hyperswitch payout confirm 결함에 대한 Proof-of-concept 및 lab: POST /payouts/{id}/confirm에 더미 client_secret과 amount를 함께 전달하면 저장된 payout amount가 증가한다.
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · hyperswitch-payout-confirm-secret
Hyperswitch 2026.09.21.0 - Juspay
payouts_confirm는 check_value_present("client_secret")로 pk_를 인증합니다. 존재 여부만 확인합니다. 동일 여부는 확인하지 않습니다. Payments confirm은 여전히 바인딩합니다: authenticate_client_secret는 불일치 시 IR_09를 반환합니다. confirm 본문은 전체 PayoutCreateRequest입니다. update_payouts_and_payout_attempt는 커넥터 라우팅 이전에 amount를 기록합니다.
더미 client_secret과 amount=99900을 payouts confirm에 사용하면 99900이 저장됩니다. 동일한 더미를 사용한 payments confirm은 여전히 IR_09입니다.
| ID | 아직 CVE 없음 |
| CWE | CWE-863, CWE-345 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| 제품 | Hyperswitch |
| 영향받는 버전 | 2026.09.21.0까지의 payouts confirm |
| 인증 | publishable pk_와 payout id; 더미 secret |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1 전용 |
publishable key(공개, checkout)와 payout id(payout 링크, 머천트 대시보드, 클라이언트 create 응답)가 필요합니다. 더미 secret과 새로운 amount로 POST /payouts/{id}/confirm을 보냅니다. 커넥터 라우팅이 400 IR_39(적격 payout 커넥터 없음)를 반환하더라도 retrieve는 증가된 금액을 보여줍니다. 쓰기는 이미 발생했습니다. payout 프로세서가 있는 상점에서의 이행이 다음 단계입니다.
pk_가 없는 게스트는 이 버그가 아닙니다. secret sk_ confirm은 머천트 측입니다. 셸이 아닙니다. 이 랩 이미지에서 성공적인 커넥터 payout도 아닙니다.
서명되지 않은 Worldpayxml 웹훅과 동일한 제품입니다. 다른 버그입니다.
check_value_present를 읽고, 그다음 payments의 req_cs != pi_cs를, 그다음 payouts_core 이전의 update_payouts_and_payout_attempt를 읽었습니다. pk_에 대한 인증은 "checkout SDK"입니다. secret은 브라우저 세션을 이 payout에 바인딩해야 합니다. Payments는 동일 여부를 확인합니다. Payouts는 존재 여부만 확인합니다. 비어 있지 않은 더미면 충분합니다. JSON은 여전히 create 요청이므로 confirm에서 amount는 no-op이 아닙니다.
이것을 처음 보는 클라이언트는 client_secret 없이 confirm을 보내고 MissingRequiredField를 받습니다. 존재 여부입니다. 실제 secret을 보내면 당신이 지불인입니다. payments confirm에 더미를 보내면 IR_09를 받습니다. 그것이 대조군입니다. payouts confirm에 더미를 보내십시오.
이미 기록된 잘못된 방향: HTTP 400 IR_39를 "아무 일도 일어나지 않음"으로 취급하기(payout을 retrieve하십시오); confirm이 amount를 생략했기 때문에 amount가 1000으로 유지됨(unwrap_or가 이전 값을 유지함); payout이 이미 종료 상태(Success / Failed / Cancelled)임; 리버스 셸. 극적인 연출. 증거는 더미 secret 이후 retrieve amount=99900이며, payments confirm은 여전히 IR_09입니다.
그다음: 머천트, secret key, publishable pk_, worldpayxml payout 커넥터를 생성하고 confirm=false amount 1000으로 POST /payouts/create를 보냅니다. RequiresConfirmation. Payments 더미-secret 대조군. Payouts 더미 99900. Retrieve.
cd lab
./run.sh
오직 http://127.0.0.1:18083만 대상으로 하십시오. 웹훅 랩과 compose 프로젝트를 공유하지 마십시오.
IOC amount_before=1000 status_before=requires_confirmation
IOC payments.confirm dummy-secret status=400 IR_09 client_secret mismatch
IOC payouts.confirm dummy-secret status=400 IR_39 no eligible connector
IOC retrieve amount=99900 status=requires_confirmation
SUCCESS Hyperswitch payout confirm unbound client_secret amount raise
payments가 하는 방식대로 client_secret을 payouts.client_secret과 비교하고, 그 검사가 통과할 때까지 confirm에서 PayoutCreateRequest.amount를 적용하지 마십시오. 더미 secret은 IR_09(또는 401)여야 하며, retrieve amount는 1000으로 유지되어야 합니다.
payouts.rs routes · authentication.rs · payouts/helpers.rs · core/payouts.rs · payments/helpers.rsGNU Affero GPL v3.0. LICENSE를 참조하십시오. 루프백 랩 전용. 보증 없음.