<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: ViVi Li</title>
    <description>The latest articles on DEV Community by ViVi Li (@vivi_li_6feb3149e81294423).</description>
    <link>https://dev.to/vivi_li_6feb3149e81294423</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4074381%2Fab1e9cda-d306-435b-843f-c36683150a64.png</url>
      <title>DEV Community: ViVi Li</title>
      <link>https://dev.to/vivi_li_6feb3149e81294423</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vivi_li_6feb3149e81294423"/>
    <language>en</language>
    <item>
      <title>Designing ichat Against the OWASP Top 10: Privacy Principles Behind an AI Reply Generator</title>
      <dc:creator>ViVi Li</dc:creator>
      <pubDate>Wed, 12 Aug 2026 16:38:34 +0000</pubDate>
      <link>https://dev.to/vivi_li_6feb3149e81294423/designing-ichat-against-the-owasp-top-10-privacy-principles-behind-an-ai-reply-generator-214f</link>
      <guid>https://dev.to/vivi_li_6feb3149e81294423/designing-ichat-against-the-owasp-top-10-privacy-principles-behind-an-ai-reply-generator-214f</guid>
      <description>&lt;p&gt;Most AI writing tools follow the same pattern: open a chat window, paste your message, describe what you want, wait, regenerate if the tone is off. I wanted ichat to skip all of that — select a message, get two ready replies (one casual, one professional), done. But the more interesting problem turned out to be underneath the UI: how do you build something that reads people's private messages and still make it trustworthy?&lt;/p&gt;

&lt;p&gt;While designing ichat (by Veyon Solutions), I used the OWASP Top 10 as a mental checklist — not because we're marketing a "security product," but because a tool that touches personal conversations has to earn trust by design, not by policy document.&lt;/p&gt;

&lt;h2&gt;
  
  
  A01: Broken Access Control → design for "nothing to break into"
&lt;/h2&gt;

&lt;p&gt;The simplest way to avoid access-control bugs is to minimize what there is to control access to. ichat's core flow doesn't persist your message content at all, so there's no long-lived store of other people's data that a bug could ever expose across accounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  A02: Cryptographic Failures → the best-protected data is data you don't keep
&lt;/h2&gt;

&lt;p&gt;Instead of leaning entirely on encryption-at-rest to protect stored messages, ichat's philosophy is to process a message for the single request it's needed for, then discard it. Less retained data means less that depends on any one cryptographic control holding up forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  A03: Injection → treat every message as hostile input, always
&lt;/h2&gt;

&lt;p&gt;Since the entire product is "take arbitrary text from a stranger's inbox," every message is treated as untrusted by default — never something to be trusted just because it "looks like" a normal reply.&lt;/p&gt;

&lt;h2&gt;
  
  
  A04: Insecure Design → the retention policy is the security control
&lt;/h2&gt;

&lt;p&gt;The single biggest architectural decision was choosing not to build a database of user messages in the first place. The one deliberate exception is content a user explicitly reports, which is kept for 90 days purely so it can be reviewed — everything else is designed to not exist after the request completes.&lt;/p&gt;

&lt;h2&gt;
  
  
  A05: Security Misconfiguration → permissions should match the feature, not the platform default
&lt;/h2&gt;

&lt;p&gt;The Chrome extension only asks for what it needs to add a right-click menu item — not broad access to read every page you visit. If a permission isn't needed for the feature in front of you, it isn't requested.&lt;/p&gt;

&lt;h2&gt;
  
  
  A09: Security Logging and Monitoring → you can't leak what you didn't log
&lt;/h2&gt;

&lt;p&gt;Because message content isn't stored, it also isn't sitting in application logs waiting to be a future liability — a nice side effect of the "discard by default" philosophy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;None of this makes ichat a security product — it's a small utility for drafting replies. But treating the OWASP Top 10 as a design lens from day one, rather than a checklist bolted on later, is what shaped decisions like never storing messages, keeping the Chrome extension's permissions minimal, and making account deletion instant and self-service from inside the app.&lt;/p&gt;

&lt;p&gt;ichat is live on Android and as a Chrome extension, with iOS in development: &lt;a href="https://www.veyon.solutions/ichat" rel="noopener noreferrer"&gt;https://www.veyon.solutions/ichat&lt;/a&gt; — built by Veyon Solutions. Feedback on the approach is very welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>privacy</category>
      <category>security</category>
    </item>
    <item>
      <title>Red-teaming your AI agent like an attacker would: introducing Argus</title>
      <dc:creator>ViVi Li</dc:creator>
      <pubDate>Wed, 12 Aug 2026 16:35:41 +0000</pubDate>
      <link>https://dev.to/vivi_li_6feb3149e81294423/red-teaming-your-ai-agent-like-an-attacker-would-introducing-argus-1503</link>
      <guid>https://dev.to/vivi_li_6feb3149e81294423/red-teaming-your-ai-agent-like-an-attacker-would-introducing-argus-1503</guid>
      <description>&lt;p&gt;Most LLM eval frameworks score a single prompt and a single response. That's not really what ships to production anymore. What ships is an agent: a system that plans, calls tools, reads documents, opens browsers, and holds state across many turns. The place that system actually breaks is adversarial robustness, not benchmark accuracy — prompt injection through a retrieved document, tool-call confusion, a jailbreak that only lands after three turns of setup.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/gy15901580825/Argus" rel="noopener noreferrer"&gt;Argus&lt;/a&gt; to test agents the way an attacker actually would: as a black box, over the wire, against a live endpoint, with no source access. Apache 2.0, open for anyone to use or extend.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Argus ships with a library of 167 adversarial probes: hand-authored coverage of the OWASP LLM Top 10, scenarios pulled from public model system cards (crescendo, many-shot jailbreak, sleeper-agent triggers), browser-agent-specific attacks, and wrappers around NVIDIA's garak catalogue. On top of the static probes it runs algorithmic iterative attacks — TAP, PAIR, and black-box GCG — that adapt the prompt based on the target's responses.&lt;/p&gt;

&lt;p&gt;It can talk to five kinds of targets out of the box: OpenAI-compatible APIs, Anthropic's native API, arbitrary HTTP endpoints via a templated adapter, gRPC services (with reflection-based auto-discovery), and full browser-driven agents through Playwright.&lt;/p&gt;

&lt;p&gt;Findings are judged by an LLM (Haiku by default, escalating to Sonnet on high-severity hits) against per-probe rubrics, then written out as SARIF 2.1.0, JUnit XML, or HTML — so a scan can gate a CI pipeline through GitHub Code Scanning instead of just producing a report nobody reads.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in five minutes, no API keys
&lt;/h2&gt;

&lt;p&gt;The repo ships a deterministic local demo: a deliberately vulnerable FastAPI chatbot whose system prompt hides a few fake secrets, plus a runner that fires a curated probe set at it.&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/gy15901580825/Argus" rel="noopener noreferrer"&gt;https://github.com/gy15901580825/Argus&lt;/a&gt;&lt;br&gt;
cd Argus&lt;br&gt;
pip install fastapi httpx pydantic uvicorn slowapi pyyaml&lt;br&gt;
PYTHONPATH=. python3 demo/run_local_demo.py&lt;/p&gt;

&lt;p&gt;You'll see individual probes pass or leak in real time, then a summary attack-success rate. There's also a guardrail mode that puts a prompt-injection classifier in front of the same target, so you can compare the before-and-after numbers yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real numbers, not just a demo
&lt;/h2&gt;

&lt;p&gt;RESULTS.md in the repo walks through a measured before/after run: adding an input-side guardrail (ProtectAI's deberta-v3-base-prompt-injection-v2, wrapped as "PromptGuard") drops the attack-success rate on the demo target from 22.9% to 2.9%, at roughly 275ms p50 latency overhead — and it documents the one bypass and twelve false positives we found, instead of hiding them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pointing it at your own agent
&lt;/h2&gt;

&lt;p&gt;Targets are just a YAML file:&lt;/p&gt;

&lt;p&gt;kind: openai_compat&lt;br&gt;
base_url: "&lt;a href="https://api.your-agent.example.com/v1" rel="noopener noreferrer"&gt;https://api.your-agent.example.com/v1&lt;/a&gt;"&lt;br&gt;
api_key_env: AGENT_API_KEY&lt;br&gt;
model: "your-agent-prod-v3"&lt;/p&gt;

&lt;p&gt;Then run it with the CLI:&lt;/p&gt;

&lt;p&gt;pip install argus-probe&lt;br&gt;
argus-probe run --target my_target.yaml --probes owasp_&lt;em&gt;,syscard_&lt;/em&gt; --judge anthropic --report sarif &amp;gt; argus.sarif&lt;/p&gt;

&lt;p&gt;For CI, there's a bundled &lt;code&gt;argus-probe-action@v1&lt;/code&gt; GitHub Action with a &lt;code&gt;--block-on-critical&lt;/code&gt; flag to fail the build on high-severity findings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;Argus is pre-1.0. The CLI, REST API, probe library, judge harness, and report formats are stable; the orchestrator's internal dispatch contract may still shift. The web UI and SaaS surface are actively being built.&lt;/p&gt;

&lt;p&gt;If you're doing any kind of AI security or red-teaming work, I'd genuinely like your feedback — probes that are missing, target adapters you need, report formats that don't fit your pipeline. Issues and PRs are welcome; the &lt;a href="https://github.com/gy15901580825/Argus/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contributing guide&lt;/a&gt; has the repo layout and probe schema.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/gy15901580825/Argus" rel="noopener noreferrer"&gt;https://github.com/gy15901580825/Argus&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>security</category>
      <category>llm</category>
    </item>
  </channel>
</rss>
