File size: 7,474 Bytes
44d0ce0 f8e9431 44d0ce0 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | <!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>RecRedTeam AuditLab β red-team audit for shopping agents</title>
<meta name="description" content="Interactive red-team audit for LLM and agentic recommendation and shopping assistants: 9 threat categories mapped to OWASP ASI 2026, a deterministic agent, and three defense plugins compared on a 234-case public split.">
<meta property="og:title" content="RecRedTeam AuditLab">
<meta property="og:description" content="Red-team audit for LLM / agentic recommendation and shopping assistants. 9 categories, OWASP ASI 2026, deterministic and reproducible.">
<meta property="og:type" content="website">
<link rel="stylesheet" href="assets/style.css">
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Ctext y='.9em' font-size='90'%3E%F0%9F%9B%A1%EF%B8%8F%3C/text%3E%3C/svg%3E">
</head>
<body>
<div class="wrap">
<header class="top">
<p class="eyebrow">RecRedTeam Β· AuditLab</p>
<h1>Red-team audit for LLM and agentic shopping assistants</h1>
<p class="lede">
Pick an attack from a nine-category taxonomy mapped to <strong>OWASP ASI 2026</strong>,
run it against a deterministic shopping agent, and watch the verdict change as you
switch defenses on. Every number on this page was produced by the audit engine in
<code>auditlab/</code> and frozen into <code>data/results.json</code> β no API key,
no network call, reproducible byte for byte.
</p>
<div class="metrics">
<span><b>ASR</b> share of cases the agent failed</span>
<span><b>effectiveness</b> 1 β ASR(defended) / ASR(baseline)</span>
<span><b>hazard</b> mean graded harm, 0β1</span>
<span><b>over-block</b> share of cases where the defense emptied the catalog</span>
</div>
</header>
<nav class="tabs" role="tablist" aria-label="Audit views">
<button class="tab" role="tab" id="tab-taxonomy" aria-controls="panel-taxonomy" aria-selected="true">Threat taxonomy</button>
<button class="tab" role="tab" id="tab-case" aria-controls="panel-case" aria-selected="false">Single attack</button>
<button class="tab" role="tab" id="tab-bench" aria-controls="panel-bench" aria-selected="false">Benchmark / leaderboard</button>
<button class="tab" role="tab" id="tab-about" aria-controls="panel-about" aria-selected="false">About</button>
</nav>
<section class="panel" id="panel-taxonomy" role="tabpanel" aria-labelledby="tab-taxonomy">
<div id="taxonomy-table"></div>
<details>
<summary>Full descriptions</summary>
<ul id="taxonomy-details"></ul>
</details>
</section>
<section class="panel" id="panel-case" role="tabpanel" aria-labelledby="tab-case" hidden>
<div class="controls">
<label class="field">
<span>Attack case</span>
<select id="case-select"></select>
</label>
<div class="field">
<span>Defense plugins</span>
<div class="plugins">
<label><input type="checkbox" data-plugin="sanitizer"> sanitizer</label>
<label><input type="checkbox" data-plugin="rag_guard"> rag_guard</label>
<label><input type="checkbox" data-plugin="policy_guard"> policy_guard</label>
</div>
</div>
</div>
<div id="case-view"></div>
</section>
<section class="panel" id="panel-bench" role="tabpanel" aria-labelledby="tab-bench" hidden>
<h2>Leaderboard</h2>
<p class="note" id="bench-note"></p>
<div class="table-wrap" id="bench-table"></div>
<h2>Attack success rate by defense</h2>
<div class="bars" id="bench-bars"></div>
<h2>Per-category ASR</h2>
<div class="table-wrap" id="bench-matrix"></div>
</section>
<section class="panel" id="panel-about" role="tabpanel" aria-labelledby="tab-about" hidden>
<h2>How an audit runs</h2>
<ol>
<li><b>Poison</b> β hidden instructions from the case are planted into the product catalog.</li>
<li><b>Defend</b> β selected plugins act at retrieval (<code>rag_guard</code>), content
(<code>sanitizer</code>) and output (<code>policy_guard</code>) level.</li>
<li><b>Answer</b> β a deterministic mock shopping agent ranks the catalog and paraphrases
what it retrieved. Its only flaw is the realistic one: it trusts retrieved content.</li>
<li><b>Judge</b> β a rule-based dual-channel judge looks for PII disclosure, untrusted
destinations, executed instructions and category failure signals.</li>
<li><b>Grade</b> β a verdict (PASS / FAIL) plus a hazard grade derived from the category
severity.</li>
</ol>
<h2>Reading the leaderboard</h2>
<p>Each plugin has a deliberately different coverage profile, which is the point of the
framework:</p>
<ul>
<li><code>sanitizer</code> kills injected instructions and unverifiable claims, but is blind
to ranking manipulation and metadata exposure.</li>
<li><code>rag_guard</code> removes poisoned listings at retrieval. Powerful, but it
over-blocks, and it cannot see a fabricated spec that looks exactly like a real one.</li>
<li><code>policy_guard</code> only rewrites the answer. It stops PII leaks and phishing
redirects and nothing else.</li>
</ul>
<p><b>Product hallucination is the category no rule-based defense solves.</b> Fabricated but
plausible specs ("30-day battery life", "#1 best seller", "50,000 units sold") are lexically
indistinguishable from real ones. Closing that gap needs grounding and external verification,
which is the open research direction.</p>
<h2>Limitations</h2>
<ul>
<li>The agent under test is a <b>deterministic mock</b>, not a real LLM. Absolute ASR values
describe this mock; what transfers to real agents is the relative coverage profile of the
defenses and the taxonomy itself.</li>
<li>Only the <b>rule channel</b> of the judge runs here. The full RecRedTeam framework adds an
optional LLM judge channel and LangGraph / OpenAI-Agents adapters.</li>
<li>Attacks target a <b>local simulated catalog</b>, never a real system.</li>
<li>This page is a <b>static snapshot</b>: the engine ran once over the public split and the
results were frozen. Rebuild them with <code>python build_static.py</code>.</li>
</ul>
<h2>Links</h2>
<ul>
<li>Dataset β <a href="https://huggingface.co/datasets/NoahIsARider/RecRedTeam-ASI-Bench">NoahIsARider/RecRedTeam-ASI-Bench</a></li>
<li>Framework β <a href="https://github.com/NoahIsARider/RecRedTeam">github.com/NoahIsARider/RecRedTeam</a></li>
<li>Reference Gradio implementation β <code>app.py</code> in this repo, run it locally with <code>pip install -r requirements.txt && python app.py</code></li>
<li>Author β Fangyanuo Zhou Β· <a href="https://noahisarider.github.io/">noahisarider.github.io</a></li>
</ul>
</section>
<footer>
Defensive research only. Attack cases run against a local simulated catalog, never against real
systems. MIT Β· dataset CC BY 4.0 Β· <span id="build-meta"></span>
</footer>
</div>
<script src="assets/app.js"></script>
</body>
</html>
|