WWBN AVideo: Authenticated wallet credit bypass in AuthorizeNet processPayment endpointGHSA-9392-pj54-qqf8
MEDIUMFix: WWBN/AVideo@8224024GHSA-9392-pj54-qqf8 is a medium-severity (CVSS 4.3) CWE-345 vulnerability in WWBN/AVideo. No vendor fix is recorded yet; mitigation options are listed below.
Exploitation Status
Proof-of-concept exploit code exists
- CISA’s SSVC triage found public proof-of-concept exploit code for this CVE, though no confirmed active exploitation.
- CISA assesses this as automatable — exploitation doesn’t require manual, per-target effort, which raises the odds of mass scanning and opportunistic attacks.
Exploitation and automatability from CISA’s SSVC triage for GHSA-9392-pj54-qqf8.
EPSS Exploitation Probability
Probability of exploitation in the next 30 days, from FIRST.org EPSS.
How urgent is this, really
GHSA-9392-pj54-qqf8 by exploitation likelihood (EPSS) against impact (CVSS). Outside the shaded patch-first corner.
Where this sits among everything scored
Of 390,400 CVEs with a current EPSS score, this one falls in the < 10% band (highlighted). Counts from FIRST.org, log-scaled.
Real-World Exposure
WWBN/AVideoReal-time download stats are indexed for npm and PyPI packages. This vulnerability affects Packagist packages — download data is not available via public APIs for these ecosystems.
Description
Summary
plugin/AuthorizeNet/processPayment.json.php credits the logged-in user's wallet based only on the attacker-controlled amount POST parameter.
The endpoint contains a TODO for real Authorize.Net charging, hardcodes $paymentSuccess = true, and then calls YPTWallet::addBalance() without validating
any Authorize.Net transaction, webhook signature, hosted payment token, nonce, or server-side payment record.
This allows any logged-in user to add arbitrary funds to their own AVideo wallet when the AuthorizeNet and YPTWallet plugins are enabled.
Details
Affected file:
plugin/AuthorizeNet/processPayment.json.php
Relevant code:
$amount = isset($_POST['amount']) ? floatval($_POST['amount']) : 0;
$userData = isset($_POST['userData']) ? $_POST['userData'] : [];
if ($amount <= 0) {
echo json_encode(['error' => 'Invalid amount']);
exit;
}
// TODO: Implement payment logic using Authorize.Net API
// Example: Call Authorize.Net API here
// $result = $plugin->chargePayment($amount, $userData);
// Simulate payment success for now
$paymentSuccess = true;
$users_id = @User::getId();
if ($paymentSuccess && !empty($users_id)) {
$walletPlugin = AVideoPlugin::loadPluginIfEnabled("YPTWallet");
if ($walletPlugin) {
$walletPlugin->addBalance($users_id, $amount, 'Authorize.Net one-time payment');
echo json_encode(['success' => true, 'result' => 'Payment processed and wallet updated']);
exit;
}
}
Vulnerable flow:
$_POST['amount']is read from the client.- The endpoint only checks that the amount is greater than zero.
- The real Authorize.Net charge is not performed.
$paymentSuccessis hardcoded to true.- The logged-in user's wallet is credited with the client-supplied amount.
There is no verification of:
- Authorize.Net transaction ID
- payment token
- webhook signature
- pending payment record
- expected server-side amount
- currency
- duplicate transaction/replay state
PoC
Prerequisites:
- AVideo with AuthorizeNet plugin enabled
- YPTWallet plugin enabled
- Attacker has any valid user account
Steps:
- Log in as a low-privileged user.
- Open the wallet page and record the current balance.
- Send the following request with the user's authenticated session cookie:
curl -i -s -b 'PHPSESSID=<user_session>' \
-X POST 'https://target.example/plugin/AuthorizeNet/processPayment.json.php' \
--data 'amount=9999&userData[note]=poc'
- The endpoint returns:
{"success":true,"result":"Payment processed and wallet updated"}
- Refresh the wallet page.
- The wallet balance is increased by 9999.
No Authorize.Net hosted payment page, card payment, transaction confirmation, webhook, or server-side payment validation is required.
Impact
A normal authenticated user can mint arbitrary wallet balance.
Depending on the target site's configuration, this may allow the attacker to:
- purchase paid videos or subscriptions without payment
- abuse any feature backed by YPTWallet
- transfer fake funds to other users
- manipulate accounting or payout-related workflows
- bypass monetization controls
Recommended fix
- Remove or disable
processPayment.json.phpif it is obsolete. - Never credit wallet balance from client-supplied
amountalone. - Use the existing Authorize.Net hosted token / webhook / transaction reconciliation flow.
- Require a verified Authorize.Net transaction ID and server-side amount lookup before calling
addBalance(). - Add regression tests proving arbitrary POSTs cannot credit a wallet.
Affected Packages
| Ecosystem | Package | Vulnerable range | Fix |
|---|---|---|---|
| 🐘Packagist | WWBN/AVideo | all versions | No fix |
Affected Products
avideowwbnDetection & mitigation playbook
Open-source dependencyDetect
Scan your dependency tree (package-lock.json, pnpm-lock.yaml, requirements.txt, go.sum, etc.) for WWBN/AVideo, including transitive dependencies — a direct dependency you never call can still pull in a vulnerable version.
Remediation status
No patched version of WWBN/AVideo has shipped for GHSA-9392-pj54-qqf8 yet. Where your build allows, override or pin the dependency away from the vulnerable range, and apply any maintainer-recommended mitigation.
Mitigate without a patch
If you can't upgrade right away: gate or disable the affected feature, validate untrusted input at the boundary, and avoid passing attacker-controlled data into the vulnerable path. O3's runtime protection blocks exploitation in production as an interim safeguard until the upgrade lands.
Frequently Asked Questions
Is GHSA-9392-pj54-qqf8 in your dependencies?
Find it across Packagist, including transitive dependencies.