A toy PHP complaint-form script with a missing authorization check that only matters if you actually deployed it
CodeAstro Complaint Management System 1.0 is a free open-source PHP/MySQL learning project distributed via codeastro.com — the same vendor whose Student Attendance, HR, and Restaurant POS scripts cycle through the CVE feed weekly. CVE-2026-13549 is tagged CWE-285 Improper Authorization, vector AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L, meaning an unauthenticated remote attacker can trick an authenticated user into triggering a state-change (likely a complaint create/edit/delete or status flip) that the app fails to verify ownership on. No confidentiality loss, only partial integrity and availability of complaint records.
Vendor severity of MEDIUM 5.4 is generous. These CodeAstro CVEs are bulk-submitted student/researcher findings against tutorial code that has effectively zero enterprise deployment. The CVSS math is correct for the bug class, but the deployment population is hobbyists, students, and a handful of small businesses running it as-is. For a defender managing 10,000 hosts, the realistic probability this software is in your fleet is near zero — and if it is, the bug is the least of your problems.
3 steps from start to impact.
Locate a live instance
- Target organization actually deployed this script
- Instance reachable from attacker network
- Software is a tutorial download, not an enterprise product — install base is negligible
- Most installs sit on localhost or shared hosting, not corporate perimeter
Craft the authorization-bypass request
- Knowledge of the vulnerable endpoint (trivial — source is public on codeastro.com)
- A target user must be logged in and click/load the payload
- Requires user interaction (UI:R)
- Modern browsers' SameSite=Lax cookie defaults break naive CSRF on POST forms
Tamper with complaint data
C:N/I:L/A:L. No credential theft, no shell, no pivot. Damage is bounded to the integrity of grievance records inside one app instance.- Steps 1-2 succeed
- Database backups (if any) restore state trivially
- Impact does not cross application or host boundary
The supporting signals.
| In-the-wild exploitation | None observed. No GreyNoise tag, no Shodan campaign chatter, no honeypot hits for this specific endpoint class as of 2026-06-29. |
|---|---|
| Public PoC | Typical pattern for CodeAstro CVEs is a one-paragraph VulDB writeup with a curl reproducer. No weaponized tooling, no Metasploit module. |
| EPSS | Expect < 0.1% (bottom-decile). Tiny install base + UI:R + low impact yields no exploit prediction signal. |
| KEV status | Not listed by CISA. No CodeAstro product has ever made KEV and none is plausible. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:L/A:L → unauth network, low complexity, *user interaction required*, no confidentiality loss, low integrity & availability impact. |
| Affected versions | CodeAstro Complaint Management System 1.0 (the only published version). |
| Fixed version | None published. CodeAstro rarely ships patches; treat as permanently unpatched tutorial code. |
| Exposure / install base | Negligible commercial footprint. Shodan/Censys queries for CodeAstro fingerprints return small hundreds of instances globally, overwhelmingly small-business and student hosting. |
| Disclosure | 2026-06-29 via the standard VulDB → MITRE pipeline that processes CodeAstro submissions in bulk. |
| Reporter | Anonymous / student researcher submission via VulDB, consistent with the rest of the CodeAstro CVE stream. |
noisgate verdict.
The single decisive factor is install-base irrelevance: CodeAstro Complaint Management System is hobbyist tutorial code with no measurable enterprise deployment, and the bug's blast radius is bounded to tampering with complaint rows in one app instance. Even if present, the chain requires user interaction and yields no credential, host, or lateral access.
Why this verdict
- Install-base floor: CodeAstro ships learning-project PHP scripts; commercial inventory feeds (Censys/Shodan) show only small hundreds of global instances. No high-value-role variant of this component exists — there is no 'domain controller version' of a complaint form.
- Friction stack: UI:R cookie+click requirement, modern SameSite=Lax browser defaults, and the C:N rating combine to cap real-world impact at low-integrity data tampering.
- Role multiplier: none applicable. The component is not in the high-value catalog (no IdP, hypervisor, CA, EDR, backup, CI/CD, or edge appliance role). Even worst-case deployment is a public complaint intake page — fleet/identity/supply-chain blast radius is structurally impossible.
- No exploitation signal: not on KEV, no GreyNoise activity, EPSS bottom-decile, no weaponized PoC.
Why not higher?
Vendor's MEDIUM 5.4 is a paper score from CVSS arithmetic; it ignores that the affected software is non-enterprise and the bug yields no confidentiality, no code execution, and no privilege escalation. There is no role multiplier available to lift this above LOW.
Why not lower?
Not IGNORE because the bug is real, unauthenticated, and trivially exploitable where the software does exist — small businesses and student projects running it as a public complaint intake form do see genuine record-tampering risk. Document and patch when convenient; do not pretend it's a non-issue.
What to do — in priority order.
- Inventory whether CodeAstro Complaint Management System is anywhere in your estate — Run an asset query against your CMDB and external attack surface tool for
codeastro,complaint-management, and the default install paths. If zero hits — and it almost certainly is zero — close the ticket. No mitigation SLA applies under noisgate LOW; this is backlog hygiene. - If found, place behind authenticated reverse proxy with strict Origin/Referer enforcement — Front the app with nginx/Caddy/Cloudflare and enforce same-origin POST. This neutralizes the CSRF delivery vector without touching the vulnerable code. Apply opportunistically within the 365-day remediation window.
- Set application session cookies to
SameSite=Strict; HttpOnly; Secure— Edit the PHP session config or inject the header at the proxy. Breaks the UI:R cross-site delivery path entirely for modern browsers. - Replace with a maintained product if it handles real grievance data — CodeAstro will not ship a patch. If the app processes regulated data (HR grievances, customer complaints), migrate to a maintained alternative — this is a posture problem, not a CVE problem.
- WAF signature updates — no vendor ships a signature for a tutorial PHP app this obscure; you would have to write a custom rule against your specific endpoint.
- EDR / host-based controls — the bug is an app-layer authorization gap; nothing on the host sees it as malicious.
- Network segmentation alone — if the app is intentionally public-facing (the normal deployment), segmentation does not apply.
Crowdsourced verification payload.
Run from an auditor workstation with network reach to suspected hosts. Invoke as ./check_codeastro.sh https://target.example.com — no privileges required, just HTTP access. Reports VULNERABLE if the CodeAstro Complaint Management System fingerprint is detected, PATCHED if the path responds but with a different app, UNKNOWN on network or detection ambiguity.
#!/usr/bin/env bash
# noisgate verification — CVE-2026-13549
# CodeAstro Complaint Management System 1.0 — CWE-285 improper authorization
# Exit codes: 0 = PATCHED/not present, 1 = VULNERABLE (fingerprint match), 2 = UNKNOWN
set -u
TARGET="${1:-}"
if [[ -z "$TARGET" ]]; then
echo "usage: $0 https://host[:port]" >&2
exit 2
fi
UA='noisgate-scan/1.0'
TMP=$(mktemp)
trap 'rm -f "$TMP"' EXIT
# Common CodeAstro Complaint Management paths
PATHS=(
'/'
'/index.php'
'/login.php'
'/admin/'
'/admin/index.php'
'/complaint-management-system/'
'/complaint/'
)
FOUND=0
ERRORS=0
for p in "${PATHS[@]}"; do
url="${TARGET%/}$p"
code=$(curl -sk -A "$UA" --max-time 8 -o "$TMP" -w '%{http_code}' "$url" || echo '000')
if [[ "$code" == '000' ]]; then
ERRORS=$((ERRORS+1))
continue
fi
if grep -qiE 'codeastro|complaint[- ]management[- ]system|cms.*complaint' "$TMP"; then
FOUND=1
echo "fingerprint hit: $url (HTTP $code)"
break
fi
done
if [[ $FOUND -eq 1 ]]; then
echo 'VULNERABLE — CodeAstro Complaint Management System detected; vendor has not published a fix for CVE-2026-13549'
exit 1
fi
if [[ $ERRORS -ge ${#PATHS[@]} ]]; then
echo 'UNKNOWN — target unreachable on all probed paths'
exit 2
fi
echo 'PATCHED — no CodeAstro Complaint Management System fingerprint on probed paths'
exit 0
If you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.