Droid as a Judge
APWeb Blind Security Bake-off
Amp
Ultra · $8.2410 min · 6.80
Claude Code
High · $110~16h · 5.66
ArduPilot APWeb @ 50b6b7ac · 3,157 lines of C · 2026-08-07
The Target — Overview
What it is
APWeb is ArduPilot's embedded HTTP/WebSocket server: configuration UI, file transfer, telemetry and firmware-facing workflows in 3,157 lines of C.
Where it runs
Technologies
CHTTP/1.1WebSocketMAVLinkmultipart uploadtemplatesfilesystemWhy this target?
A compact, security-relevant, clean target with zero answer-key. Both contestants started blind from the same commit.
Architecture & Attack Surface
Browser / API client
│ HTTP + WebSocket
▼
┌──────────────── APWeb ────────────────┐
│ parser → router → handlers │
│ │ │ ├─ multipart │
│ │ │ ├─ templates │
│ │ │ └─ firmware/files │
│ └─ WebSocket ↔ MAVLink global state │
└──────────────┬────────────────────────┘
├─ Linux filesystem
└─ FreeRTOS / flight controller⚠ No authentication
Network-reachable parsing and privileged file/firmware operations share one trust boundary. Memory safety, path handling and state integrity all matter.
The Tools — Amp

What was tested
- Focused source-code review
- AI-assisted security analysis
- Exploit-path reasoning
- Local proof-of-concept validation
How it ran
- Ultra reasoning mode
- $8.24 total
- 10m 08s wall time
- 0 subagents
- Blind, cold-start review
Result: 7 register classes covered, 12 delivered findings, 4 confirmed vulnerabilities — reliable and economical, but narrow.
The Tools — Claude Code
What was tested
- Multi-agent source review
claude-securityplugin- Broad file-by-file fan-out
- Cross-agent synthesis
How it ran
- High reasoning
- $110 total
- 565 subagents launched
- 495 errored
- Account limit reached
- ~16 hours, blind
Result: 21 register classes covered and substantially greater depth, offset by severe orchestration failure and cost.
Methodology
Setup
- Same commit pin:
50b6b7ac - Cold-start, blind runs
- No answer-key or cross-contamination
- Contestant outputs untouched
What the judge did
- Normalized claims into vulnerability classes
- Reproduced or inspected disputed evidence
- Separated platform and confidence scope
- Applied one weighted rubric
| Criterion | Weight | Criterion | Weight |
|---|---|---|---|
| Coverage | 25% | Calibration | 15% |
| Evidence | 12% | Reliability | 15% |
| Scope honesty | 10% | Cost | 13% |
| Triage | 5% | Operational safety | 5% |
Findings Register — Part 1
| # | Vulnerability class | Scope | Amp | Claude |
|---|---|---|---|---|
| 1 | unescape() OOB read/write | both | ✓ + PoC | ✓ |
| 2 | Multipart unsigned underflow | both | ✓ under-rated | ✓ Critical |
| 3 | NULL-deref, no Content-Type | both | ✓ | ✓ |
| 4 | grab_line() 1-byte OOB write | both | ✗ | ✓ High |
| 5 | Template parser use-after-free | both | ✗ | ✓ High |
| 6 | grab_line() realloc NULL deref | both | ✓ | ✗ |
| 7 | atoi Content-Length | both | ✓ | ✓ |
| 8 | MAVLink off-by-one (latent) | both | ✓ mis-FP | ✓ |
| 9 | MAVLink char-array over-read | both | ✗ | ✓ suspected |
| 10 | Unbounded recursion → stack DoS | both | ✗ | ✓ |
| 11 | MAVLink global state data race | both | ✗ | ✓ |
| 12 | uint16_t vs int argc | both | ✗ | ✓ suspected |
Findings Register — Part 2
| # | Vulnerability class | Scope | Amp | Claude |
|---|---|---|---|---|
| 13 | msg memory leak | both | ✗ | ✓ |
| 14 | (*len) -= 2 boundary desync | both | ✗ | ✓ |
| 15 | Wildcard CORS | both | ✗ | ✓ |
| 16 | Path traversal fs/ | FreeRTOS | detected, dropped | ✓ |
| 17 | Arbitrary file write (upload) | FreeRTOS | ✗ | ✓ |
| 18 | get_ssid stack overflow | FreeRTOS | ✗ | ✓ unverified |
| 19 | Firmware MD5-only (no sig) | FreeRTOS | ✗ | ✓ unverified |
| 20 | WiFi password disclosed | FreeRTOS | partial | ✓ |
| 21 | WiFi password logged | FreeRTOS | ✗ | ✓ |
| 22 | Hardcoded HERE Maps creds | client | false neg | ✓ Low |
| 23 | path[strlen-1] off-by-ones ×3 | FreeRTOS | ✓ | ✗ |
| 24 | Output injection / XSS | FreeRTOS | detected, dropped | candidates |
The union is 24
Neither tool is the answer-key. Their overlap raises confidence; their unique findings make the combined review stronger.
Judge's Rulings
APWEB-19: UAF confirmed
Template parser lifetime crosses invalidation. Claude's High finding stands.
APWEB-03: Critical → Medium
Unsigned underflow exists, but practical impact depends on word size and allocation behavior.
grab_line: two bugs
The one-byte OOB write and realloc NULL dereference are distinct classes. Each tool found one.
HERE Maps: Amp false negative
Hardcoded client credentials were present; dismissal was not supported by the code context.
Cost Analysis
Thread usage
4,965,331 total tokens
4,910,680 input · 54,651 output · 85% cached
40 requests · 2 models
Model breakdown
Fable 5: 38 requests · $8.237
GPT-5.6 Luna: 2 requests · $0.002
Total both tools: $118.24 · Amp is ~13× cheaper
| Amp unit | Calculation | Cost |
|---|---|---|
| Delivered finding | $8.24 / 12 | $0.69 |
| Confirmed vulnerability | $8.24 / 4 | $2.06 |
| Register class covered | $8.24 / 7 | $1.18 |
The Scorecard
| Coverage | Calibration | Evidence | Reliability | Honesty | Cost | Triage | Safety | Total | |
|---|---|---|---|---|---|---|---|---|---|
| Amp | 3.2 | 6.8 | 5.0 | 9.2 | 9.0 | 9.4 | 8.2 | 9.3 | 6.80 |
| Claude | 7.5 | 7.5 | 5.0 | 3.0 | 7.5 | 3.0 | 7.5 | 2.0 | 5.66 |
The Verdict
Winner: Amp
6.80 vs 5.66Amp ran in Ultra mode — its highest reasoning tier.
Amp wins reliability & cost
Clean completion, evidence discipline and ~$0.69 per delivered finding.
Claude wins depth
21 of 24 classes and the strongest multi-hop discoveries.
Weight-sensitive
Coverage-first buyers may rationally prefer Claude despite the official score.
The union is the result
Together they expose the most complete actionable register.
Recommendations
For the security team
- Run both: complementary discovery is material.
- Use Amp for repeatable cadence at $8.24/run.
- Use Claude for periodic depth scans, with unstable fan-out disabled.
- Fix order: confirmed memory safety → writes/traversal → secrets → hardening.
Before round 3
- Run Claude twice to measure variance.
- Use structured subagent/task fan-out and broader review coverage. Ultra mode was already used — the gap isn't reasoning depth, it's analysis breadth. Fan out across files with cross-check agents to reach multi-hop bugs.
- Restore local PoC execution and preserve evidence artifacts.
- Use two targets to reduce target-specific bias.
About / Credits

Droid as a Judge · APWeb bake-off · 2026-08-07
Contestant outputs untouched
