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 &amp;&amp; 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>