alist.platform audit← Program status

A-List Security Audit

White-box security assessment of 13 Bitbucket repositories, grounded in the OWASP Top 10 (2021), OWASP API Security Top 10 (2023), OWASP MASVS, CWE, CVSS 3.1 and NIST CSF 2.0. Each finding was produced by skill-driven scanners and confirmed by an adversarial verification pass. Click any repository for its full report, or open the cross-repo correlation analysis. Generated 2026-05-30.

35
P0 critical
72
P1 high
65
P2 medium
78
P3 low / info
8
Critical repos
250
Total findings

Methodology

Every repository was assessed by automated scanners that apply formal offensive-security playbooks (the anthropic-cybersecurity-skills library — OWASP WSTG, API Top 10, MASVS and CWE methodology), one scanner per security dimension. An adversarial red-team reviewer then re-opened each cited file:line to confirm or reject the finding, killing false positives, deduplicating, and assigning CVSS 3.1 vectors, CWE ids and OWASP categories. Findings are evidence-backed and severity-rated P0–P3.

OWASP Top 10 (2021) OWASP API Security Top 10 (2023) OWASP MASVS / Mobile Top 10 OWASP WSTG CWE CVSS 3.1 NIST CSF 2.0
Dimensions assessed: injection · broken-access-control · auth/JWT/OAuth · secrets & cryptography · SSRF/CSRF/CORS/misconfig · supply-chain & CI/CD · business-logic & race · mobile storage/transport/IPC · client-side XSS & token handling — backed by 44 distinct skill playbooks across 60 scanner runs and 13 verification passes.

Day-0 containment — rotate before you refactor

The deep audit confirmed production secrets committed across multiple backends, all recoverable from git history. Rotating at the provider is the only real fix (git rm does not remove history). Order matters — start with the credential that unlocks everything else. Full cross-repo blast-radius analysis: Cross-Repo Correlation →

  1. a-list-ios — Bitbucket app passwords committed in README + AppDelegate.swift. These unlock every repository in this dashboard, so revoke them FIRST at bitbucket.org/account/settings/app-passwords. Also: APNS .p8 key and a privileged Intercom token.
  2. alist-portal — Firebase Admin RSA private key, two Google OAuth client_secret+refresh-token pairs, Slack/Monday tokens, DB password, Stripe keys, and a Passport RSA .pem — all committed and loaded at runtime. A leaked APP_KEY here enables Passport token forgery.
  3. a-list-demo — live DB password, Gmail SMTP password, and a Google OAuth refresh token still in the 2020 fork. Confirm the cPanel hosts are offline, then rotate regardless.
  4. creators-website — monday.com JWT committed and inlined into the public JS bundle (both old and rotated values in history).
  5. alist-partner — committed .env (Twilio/MySQL/APP_KEY), tracked Passport oauth-private.key, hardcoded Slack webhooks, and a static urgent_otp backdoor.
  6. alist-android — privileged Intercom Access Token + Firebase key + signing-cert hash bundled into every build via eas.json/google-services.json.
  7. alist-website — CI pipeline force-pushes master to a personal GitHub account on every commit. Audit that account; revoke the pipeline credential.

OWASP Top 10 (2021) — coverage across the estate

How many of the 13 repositories are vulnerable in each category (repos where the category does not apply are excluded). Security misconfiguration, outdated components, cryptographic failures and authentication failures are near-universal.

CategoryRepos affectedVulnPartialClean
A05 Security Misconfiguration
1020
A06 Vulnerable / Outdated Components
1002
A02 Cryptographic Failures
902
A07 Identification & Authentication Failures
800
A01 Broken Access Control
701
A03 Injection
614
A08 Software & Data Integrity Failures
650
A04 Insecure Design
361
A09 Logging & Monitoring Failures
360
A10 Server-Side Request Forgery
220

Cross-repo correlation — the findings don't stay contained

Hash-verified secret reuse across the estate. Full analysis, attack chains & org-level program: Cross-Repo Correlation →

  1. Master key: the Bitbucket app password committed in a-list-ios unlocks all 13 repos → harvest every secret below.
  2. Shared production database: the abandoned a-list-demo and alist-v2 commit live DB credentials that match the active alist-partner API's (same name/user, shared password) — dead code is a live data-breach path.
  3. Reused integrations: the same Slack webhooks (portal/partner/demo) and a monday.com token (portal/demo + inlined in the creators bundle) are shared — rotating in one place isn't enough.
  4. Dev backend trusted by prod: a dev-*.alist.ae URL is hardcoded in 7 repos, including the production mobile builds.

System architecture — how the repos connect

The live platform centres on the alist-portal Laravel monolith; mobile and web clients all consume its REST API. A flaw or leaked credential in one repo frequently exposes others — see the correlation analysis for shared trust boundaries.

┌─ Active production stack ─────────────────────────────────────────────┐ Mobile users ├── a-list-ios (Swift / UIKit · CRITICAL) └── alist-android (Expo / RN · CRITICAL) └──→ alist-portal (Laravel monolith — admin, vendor & creator portals + mobile /v1/* REST API · CRITICAL) ├──→ MySQL + Redis (shared prod DB across apps) └──→ Stripe / Pusher / socket.io / Firebase / Sentry Vendors (web) └── alist-vendors (Next.js 15 · CRITICAL) alist-partner (Laravel 11 API · CRITICAL) Public web └── alist-website (Vue 3 · HIGH) ├──→ alist-cms (Strapi v4 · HIGH) └──→ alist-portal Creators.ae └── creators-website (React · CRITICAL) monday.com (token in browser ⚠) Standalone ├── pr36 (static · LOW) └── tryalist (React · MEDIUM) └─ Legacy / dormant — confirm not in prod, but secrets still live ─────┘ ├── a-list-demo (Laravel 6 / PHP 7.2 · CRITICAL — live secrets) ├── alist-v2 (Laravel 9 + Vue 3 rewrite · CRITICAL) ├── alist-vendor-portal (Vue prototype · HIGH) └── alist-cms (Strapi · HIGH)

Repository reports

Active production 8
7181111

alist-portal

PHP / Laravel — platform core backend

The single monolith behind admin, vendor & creator portals and the mobile REST API. Critical across nearly every OWASP category.

526 MB2,589 filesmaster2026-05-08
Top confirmed findings
  • 4 confirmed SQL injections in admin endpoints + 2nd-order SQLi on mobile hot path
  • Unauth IDOR discloses any user's PIN; 4-digit OTP echoed in response; backdoor OTP
  • SSRF to AWS IMDS/Redis; wildcard CORS; committed Firebase/OAuth/Stripe secrets; EOL PHP 7.3
9984

alist-partner

PHP 8.2 / Laravel 11 — partner API

REST API for the partner/merchant portal (Twilio OTP + Passport). Highest P0 count in the estate.

3.2 MB121 filesmain2025-11-06
Top confirmed findings
  • Mass-assignment self-promotion to admin; BOLA across campaigns/venues/accounts
  • Committed Passport RSA key + leaked APP_KEY → token forgery; static urgent_otp backdoor
  • Missing function-level authz on delete/bulk ops; error-message disclosure throughout
3438

a-list-ios

Swift / UIKit — production iOS

Native iOS client. Committed secrets + disabled transport security enable an account-takeover chain.

325 MB4,302 filesmaster2026-05-19
Top confirmed findings
  • Bitbucket app passwords in repo → access to ALL A-List repos; APNS .p8 + Intercom key committed
  • ATS disabled (NSAllowsArbitraryLoads) + no cert pinning → MitM of every API call
  • OTP returned in API response defeats the out-of-band factor
1566

alist-android

Expo SDK 54 / React Native / TS

Cross-platform Expo client (builds iOS, Android, web). Solid foundation undermined by a committed privileged token.

103 MB359 filesmain2026-05-14
Top confirmed findings
  • Privileged Intercom Access Token committed + bundled into every build
  • All EAS profiles (incl. production) point at the dev API; no TLS pinning, cleartext accepted
  • No lockfile / CI / SCA → supply-chain compromise undetectable; PII logged to console
2363

alist-vendors

Next.js 15 / React 19 / TS — vendor admin

Next.js admin dashboard against the partner Laravel API. Auth and XSS issues dominate.

117 MB731 filesmain2025-11-06
Top confirmed findings
  • Token in localStorage + cookie, AES-"encrypted" with a hardcoded passphrase in 4 files
  • 7 unsanitized dangerouslySetInnerHTML sinks render API HTML (XSS)
  • Middleware checks token presence not validity; .env committed; 21-day idle timeout
2222

creators-website

Create React App / TS — creators.ae

Marketing site with email capture posting to monday.com directly from the browser.

11 MB64 filesmaster2026-01-06
Top confirmed findings
  • monday.com API JWT committed and inlined into the public JS bundle
  • GraphQL injection: user email concatenated into the mutation string
  • No CSRF/rate-limit/CAPTCHA on the only form + public token = abuse vector
02611

alist-website

Vue 3 SPA — public marketing

Vue 3 SPA fed by Strapi, posting signups/careers/OAuth to a separate PHP backend.

117 MB485 filesmaster2026-04-23
Top confirmed findings
  • CI pipeline force-pushes master to a personal GitHub account every commit
  • Hardcoded dev-strapi URL ships to production; dead SignUp.vue rewrites brand emails
  • Deprecated node-sass / Vue-2 compiler; trackers without consent or SRI
0001

pr36

Static HTML / CSS / vanilla JS

Single-page brochure site. No backend, no dependencies — smallest attack surface in the estate.

5.6 MB33 filesmain2026-01-06
Notes
  • Contact form is a UI mockup (no backend) — leads silently discarded
  • No secrets, no third-party JS — clean from a security standpoint
Dormant / legacy — confirm production status 5
81363

a-list-demo LEGACY

Laravel 6 / PHP 7.2 — frozen 2020 fork

Demo/staging fork of alist-portal, frozen since 2020 but still holding live credentials.

446 MB1,268 filesmaster2020-11-02
Top confirmed findings
  • Live DB + Gmail passwords + Google OAuth refresh token committed
  • EOL PHP 7.2 + Laravel 6; Ignition CVE-2021-3129 RCE applies with APP_DEBUG=true
  • phpinfo() + error_log web-served; confirm cPanel hosts are offline
3979

alist-v2 LEGACY

Laravel 9 + Vue 3 — abandoned rewrite

Admin-panel rewrite wired to two MySQL DBs; the v1↔v2 sync was disabled in the final 2023 commit.

47 MB855 filesmaster2023-03-31
Top confirmed findings
  • Cross-database coupling to the legacy v1 DB throughout the domain layer
  • EOL Laravel 9 / PHP 8.0; committed secrets; zero tests
  • Do not extend — superseded by alist-portal (Laravel 11)
0467

alist-cms LEGACY

Strapi 4.14.4 / Node

Strapi v4 CMS backing alist-website. Single 2023 commit; ~18 months of missing patches.

3.0 MB209 filesmaster2023-10-12
Top confirmed findings
  • Strapi 4.14.4 missing ~18 months of security patches (SSRF, path-traversal CVEs)
  • Rate-limit misconfigured to 1 req/min — self-DoS of admin login
  • Uploads with no MIME/size limits; no CI, unknown hosting
0328

alist-vendor-portal LEGACY

Vue 3 + Vite — UI prototype

Vue 3 vendor-portal prototype: fake auth and hardcoded voucher logic. Superseded by alist-vendors.

13 MB211 filesmaster2024-05-15
Top confirmed findings
  • Login is a RouterLink — no authentication or route guards
  • Voucher redemption checks a hardcoded string client-side
  • FilePond uploaders have no server endpoint — nothing persists
0025

tryalist DORMANT

Create React App / React 18 / TS

Static marketing page that redirects to an external registration form. No backend, no API calls.

7.5 MB67 filesmain2025-02-11
Top confirmed findings
  • Deprecated CRA 5.0.1 build tooling with unpatched transitive CVEs
  • Broken default test; stale marketing copy; no CI

Org-level remediation roadmap

Day 0 — contain
Rotate the Day-0 credentials above, Bitbucket app passwords first (they unlock every repo). Audit the personal GitHub mirror in alist-website's pipeline. Confirm legacy cPanel hosts are offline.
Week 1
  • Fix the unauthenticated account-takeover chain in alist-portal/alist-partner (PIN-disclosure IDOR, OTP echo, backdoor OTP, OTP rate-limiting/lockout).
  • Parameterise the confirmed SQL injections; add the missing auth middleware to the ~39 ungated admin routes.
  • Move SPA tokens to HttpOnly cookies; sanitize the dangerouslySetInnerHTML sinks in alist-vendors.
Month 1
  • Introduce a real authorization layer (Policies/Gates) instead of inline role-string checks across the Laravel services.
  • Lock down CORS, add security headers, disable APP_DEBUG, restrict file uploads, fix SSRF on image fetches.
  • Upgrade EOL runtimes (PHP 7.x → 8.2+) and patch Strapi.
Quarter — structural
  • CI/CD on every repo with secret-scanning (gitleaks), SAST and SCA gates; pre-commit hooks; commit-lockfiles.
  • Adopt a secrets manager (Vault/Doppler/SSM); purge secrets from git history; rotate on a schedule.
  • Add automated tests and crash/error monitoring; separate dev vs prod API configuration per build.