Files
docs/security/data-leak-audit-comparison/index.html
T

2333 lines
45 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="Single source of truth for the homelab">
<link rel="canonical" href="http://192.168.1.8:13080/security/data-leak-audit-comparison/">
<link rel="prev" href="../../services/llm-benchmark/">
<link rel="next" href="../data-leak-audit-2026-05-20-tr004-cloud-sandbox/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>Comparison - nuclide.systems docs</title>
<link rel="stylesheet" href="../../assets/stylesheets/main.484c7ddc.min.css">
<link rel="stylesheet" href="../../assets/stylesheets/palette.ab4e12ef.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<script>__md_scope=new URL("../..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#data-leak-audit-comparison-tr-004-sessions" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../.." title="nuclide.systems docs" class="md-header__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
nuclide.systems docs
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Comparison
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_0">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="black" data-md-color-accent="blue" aria-hidden="true" type="radio" name="__palette" id="__palette_1">
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
<div class="md-search__suggest" data-md-component="search-suggest"></div>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
<div class="md-grid">
<ul class="md-tabs__list">
<li class="md-tabs__item">
<a href="../.." class="md-tabs__link">
Home
</a>
</li>
<li class="md-tabs__item">
<a href="../../CHANGELOG/" class="md-tabs__link">
Changelog
</a>
</li>
<li class="md-tabs__item">
<a href="../../RESUME/" class="md-tabs__link">
Resume
</a>
</li>
<li class="md-tabs__item">
<a href="../../ct-inventory/" class="md-tabs__link">
CT inventory
</a>
</li>
<li class="md-tabs__item">
<a href="../../infra/proxmox-state/" class="md-tabs__link">
Infra
</a>
</li>
<li class="md-tabs__item">
<a href="../../services/homelab-architecture/" class="md-tabs__link">
Services
</a>
</li>
<li class="md-tabs__item md-tabs__item--active">
<a href="./" class="md-tabs__link">
Security & audits
</a>
</li>
<li class="md-tabs__item">
<a href="../../ideas/stack-ideas/" class="md-tabs__link">
Ideas
</a>
</li>
<li class="md-tabs__item">
<a href="../../history/traefik-migration/" class="md-tabs__link">
History
</a>
</li>
</ul>
</div>
</nav>
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../.." title="nuclide.systems docs" class="md-nav__button md-logo" aria-label="nuclide.systems docs" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
nuclide.systems docs
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../.." class="md-nav__link">
<span class="md-ellipsis">
Home
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../CHANGELOG/" class="md-nav__link">
<span class="md-ellipsis">
Changelog
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../RESUME/" class="md-nav__link">
<span class="md-ellipsis">
Resume
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../ct-inventory/" class="md-nav__link">
<span class="md-ellipsis">
CT inventory
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Infra
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Infra
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../infra/proxmox-state/" class="md-nav__link">
<span class="md-ellipsis">
Proxmox state
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/portmap/" class="md-nav__link">
<span class="md-ellipsis">
Port map
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/storage/" class="md-nav__link">
<span class="md-ellipsis">
Storage
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/volumes/" class="md-nav__link">
<span class="md-ellipsis">
Volumes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/docker-networks/" class="md-nav__link">
<span class="md-ellipsis">
Docker networks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/connection-hosts/" class="md-nav__link">
<span class="md-ellipsis">
Connection hosts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../infra/proxmox-memory-audit/" class="md-nav__link">
<span class="md-ellipsis">
Memory audit
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Services
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Services
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../services/homelab-architecture/" class="md-nav__link">
<span class="md-ellipsis">
Homelab architecture
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/dev-environment/" class="md-nav__link">
<span class="md-ellipsis">
Dev environment (Coder + Gitea)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mcp-gateway/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/mcp-servers/" class="md-nav__link">
<span class="md-ellipsis">
MCP servers
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/pocket-id/" class="md-nav__link">
<span class="md-ellipsis">
Pocket-ID (OIDC)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/backrest/" class="md-nav__link">
<span class="md-ellipsis">
Backrest (backups)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/databases/" class="md-nav__link">
<span class="md-ellipsis">
Databases
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/secrets-manager/" class="md-nav__link">
<span class="md-ellipsis">
Secrets manager
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/comfyui/" class="md-nav__link">
<span class="md-ellipsis">
ComfyUI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/zoraxy/" class="md-nav__link">
<span class="md-ellipsis">
Zoraxy
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/adguard-dns/" class="md-nav__link">
<span class="md-ellipsis">
AdGuard DNS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/cloud-gpu/" class="md-nav__link">
<span class="md-ellipsis">
Cloud GPU
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/arcane/" class="md-nav__link">
<span class="md-ellipsis">
Arcane
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/doc-ingestion/" class="md-nav__link">
<span class="md-ellipsis">
Doc ingestion pipeline
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../services/llm-benchmark/" class="md-nav__link">
<span class="md-ellipsis">
LLM benchmark
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" checked>
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="">
<span class="md-ellipsis">
Security & audits
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Security & audits
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Comparison
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Comparison
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#sessions-at-a-glance" class="md-nav__link">
<span class="md-ellipsis">
Sessions at a glance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#channel-by-channel-comparison" class="md-nav__link">
<span class="md-ellipsis">
Channel-by-channel comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#risk-reduction-between-the-two" class="md-nav__link">
<span class="md-ellipsis">
Risk reduction between the two
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-drove-the-difference-model-behavior" class="md-nav__link">
<span class="md-ellipsis">
What drove the difference: model behavior
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#common-ground-both-sessions" class="md-nav__link">
<span class="md-ellipsis">
Common ground (both sessions)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-this-means-for-policy" class="md-nav__link">
<span class="md-ellipsis">
What this means for policy
</span>
</a>
<nav class="md-nav" aria-label="What this means for policy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#permanent-fixes" class="md-nav__link">
<span class="md-ellipsis">
Permanent fixes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#capability-gaps-to-close" class="md-nav__link">
<span class="md-ellipsis">
Capability gaps to close
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#defense-in-depth" class="md-nav__link">
<span class="md-ellipsis">
Defense in depth
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#action-backlog-cumulative-deduped" class="md-nav__link">
<span class="md-ellipsis">
Action backlog (cumulative, deduped)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#method" class="md-nav__link">
<span class="md-ellipsis">
Method
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../data-leak-audit-2026-05-20-tr004-cloud-sandbox/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-20 · cloud-sandbox breach
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../data-leak-audit-2026-05-21-tr004-artifacts/" class="md-nav__link">
<span class="md-ellipsis">
2026-05-21 · artifacts (clean)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../audit-claude-code-meta/" class="md-nav__link">
<span class="md-ellipsis">
Self-audit (Claude Code)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transcripts/audit-chat-2026-05-21/" class="md-nav__link">
<span class="md-ellipsis">
Transcript (audit session)
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
Ideas
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
Ideas
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../ideas/stack-ideas/" class="md-nav__link">
<span class="md-ellipsis">
Stack ideas
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle md-toggle--indeterminate" type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-ellipsis">
History
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
History
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../history/traefik-migration/" class="md-nav__link">
<span class="md-ellipsis">
Traefik (abandoned 2026-05-16)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/traefik-migration-docker-labels/" class="md-nav__link">
<span class="md-ellipsis">
Traefik labels (abandoned)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/mcp-gateway-requirements/" class="md-nav__link">
<span class="md-ellipsis">
MCP gateway requirements (superseded)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/scrubbing-list-2026-05-17/" class="md-nav__link">
<span class="md-ellipsis">
Scrubbing list (2026-05-17)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../../history/case-study/" class="md-nav__link">
<span class="md-ellipsis">
Case study
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#sessions-at-a-glance" class="md-nav__link">
<span class="md-ellipsis">
Sessions at a glance
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#channel-by-channel-comparison" class="md-nav__link">
<span class="md-ellipsis">
Channel-by-channel comparison
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#risk-reduction-between-the-two" class="md-nav__link">
<span class="md-ellipsis">
Risk reduction between the two
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-drove-the-difference-model-behavior" class="md-nav__link">
<span class="md-ellipsis">
What drove the difference: model behavior
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#common-ground-both-sessions" class="md-nav__link">
<span class="md-ellipsis">
Common ground (both sessions)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-this-means-for-policy" class="md-nav__link">
<span class="md-ellipsis">
What this means for policy
</span>
</a>
<nav class="md-nav" aria-label="What this means for policy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#permanent-fixes" class="md-nav__link">
<span class="md-ellipsis">
Permanent fixes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#capability-gaps-to-close" class="md-nav__link">
<span class="md-ellipsis">
Capability gaps to close
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#defense-in-depth" class="md-nav__link">
<span class="md-ellipsis">
Defense in depth
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#action-backlog-cumulative-deduped" class="md-nav__link">
<span class="md-ellipsis">
Action backlog (cumulative, deduped)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#method" class="md-nav__link">
<span class="md-ellipsis">
Method
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="data-leak-audit-comparison-tr-004-sessions">Data-leak audit comparison — TR-004 sessions<a class="headerlink" href="#data-leak-audit-comparison-tr-004-sessions" title="Permanent link">&para;</a></h1>
<p>Two LobeHub conversations on the same task (LUMEN TR-004 failure analysis), 24 hours apart, with different models — compared for what leaked, where, and why.</p>
<blockquote>
<p><strong>Headline verdict.</strong> Session B (2026-05-21) was clean — all data stayed within the homelab + approved-partner perimeter (SAIA / GWDG, <a href="https://docs.hpc.gwdg.de/services/ai-services/saia/index.html">DLR-vetted</a>, IdP-federated). Session A (2026-05-20) <strong>was a breach</strong>: 9 <code>lobe-cloud-sandbox</code> calls sent proprietary aerospace code+identifiers to commercial third parties (<code>api.lobehub.com</code> + codesandbox.io). <strong>The single variable that changed the outcome was the model choice.</strong></p>
</blockquote>
<h2 id="sessions-at-a-glance">Sessions at a glance<a class="headerlink" href="#sessions-at-a-glance" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th></th>
<th><strong>2026-05-20</strong></th>
<th><strong>2026-05-21</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Title</td>
<td><code>Lumen TR-004 Test Run Analysis</code></td>
<td><code>Analyzing LUMEN TR004 Test Data</code></td>
</tr>
<tr>
<td>Model</td>
<td><code>qwen3.5-397b-a17b</code></td>
<td><code>qwen3-coder-30b-a3b-instruct</code> + <code>llama-3.3-70b-instruct</code></td>
</tr>
<tr>
<td>Messages</td>
<td>60 (2 user · 21 asst · 37 tool)</td>
<td>41 (3 user · 21 asst · 17 tool)</td>
</tr>
<tr>
<td>Shepard MCP calls (LAN)</td>
<td>27</td>
<td>9</td>
</tr>
<tr>
<td><strong><code>lobe-cloud-sandbox</code> calls (off-host code exec)</strong></td>
<td><strong>9</strong></td>
<td><strong>0</strong></td>
</tr>
<tr>
<td><code>Artifacts</code> builtin (in-container)</td>
<td>0</td>
<td>5 (broken render)</td>
</tr>
<tr>
<td><code>lobe-agent-documents</code> (in-container)</td>
<td>1</td>
<td>3</td>
</tr>
<tr>
<td>LLM inference destination</td>
<td>SAIA / GWDG</td>
<td>SAIA / GWDG</td>
</tr>
<tr>
<td>Picture rendering worked?</td>
<td>yes (PNGs returned via <code>exportFile</code>)</td>
<td><strong>no</strong> (Artifacts plugin empty results, links broken)</td>
</tr>
</tbody>
</table>
<h2 id="channel-by-channel-comparison">Channel-by-channel comparison<a class="headerlink" href="#channel-by-channel-comparison" title="Permanent link">&para;</a></h2>
<pre class="mermaid"><code>flowchart TB
subgraph s1 ["2026-05-20 · qwen3.5-397b"]
direction LR
u1(["You"]) --&gt; l1[LobeHub]
l1 --&gt;|on-LAN, 27 calls| sh1[Shepard CT 101]
l1 -. inference, 21 calls .-&gt; ll1[LiteLLM] -.-&gt; sa1[(SAIA)]
l1 -. 9 code-exec calls .-&gt; sb1[(LobeHub Cloud Sandbox&lt;br/&gt;+ codesandbox.io)]
end
subgraph s2 ["2026-05-21 · qwen3-coder-30b"]
direction LR
u2(["You"]) --&gt; l2[LobeHub]
l2 --&gt;|on-LAN, 9 calls| sh2[Shepard CT 101]
l2 -. inference, 21 calls .-&gt; ll2[LiteLLM] -.-&gt; sa2[(SAIA)]
l2 -- 5 calls --&gt; af2[Artifacts plugin&lt;br/&gt;in-container, broken]
end
classDef leak fill:#5a2a2a,stroke:#c44,color:#fcc
class sa1,sa2,sb1 leak
classDef ok fill:#234c2a,stroke:#4c8,color:#cfc
class sh1,sh2,l1,l2,ll1,ll2,af2 ok</code></pre>
<p>The second session <strong>closes the worst channel</strong> (lobe-cloud-sandbox) entirely, at the cost of broken pictures. The fundamental "all LLM context goes to SAIA" leak is identical across both.</p>
<h2 id="risk-reduction-between-the-two">Risk reduction between the two<a class="headerlink" href="#risk-reduction-between-the-two" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Risk</th>
<th>2026-05-20</th>
<th>2026-05-21</th>
<th>Δ</th>
</tr>
</thead>
<tbody>
<tr>
<td>Proprietary code → commercial cloud</td>
<td><strong>HIGH</strong> (9 calls, ~1500 lines of LUMEN/P3-Lampoldshausen Python sent to LobeHub Cloud + codesandbox.io)</td>
<td><strong>NONE</strong> (0 calls)</td>
<td>100%</td>
</tr>
<tr>
<td>Proprietary text/data → academic provider</td>
<td>HIGH (21 inference calls)</td>
<td>HIGH (21 inference calls)</td>
<td>↔ no change</td>
</tr>
<tr>
<td>Picture rendering works</td>
<td></td>
<td></td>
<td>regression — needs S3 hub</td>
</tr>
<tr>
<td>Egress destinations</td>
<td>3 (SAIA + lobehub + codesandbox)</td>
<td>1 (SAIA)</td>
<td>67%</td>
</tr>
</tbody>
</table>
<h2 id="what-drove-the-difference-model-behavior">What drove the difference: model behavior<a class="headerlink" href="#what-drove-the-difference-model-behavior" title="Permanent link">&para;</a></h2>
<p>Same user prompt template both days. The model choice changed the tool selection:
- <code>qwen3.5-397b-a17b</code> → reached for <code>lobe-cloud-sandbox</code> (full Python interpreter) — because it can generate complex matplotlib pipelines and execute them.
- <code>qwen3-coder-30b-a3b-instruct</code> → reached for <code>Artifacts</code> (SVG + HTML generators) — code-focused model, prefers structured output over runtime execution.</p>
<p><strong>Operational takeaway:</strong> <strong>model selection is a privacy control</strong>. A LobeHub policy that defaults sensitive chats to <code>qwen3-coder-30b</code> (or any model that doesn't reach for cloud sandbox) materially reduces the worst-case leak — even before you disable the sandbox plugin entirely.</p>
<h2 id="common-ground-both-sessions">Common ground (both sessions)<a class="headerlink" href="#common-ground-both-sessions" title="Permanent link">&para;</a></h2>
<ul>
<li><strong>All Shepard MCP fetches stayed on LAN.</strong> Good.</li>
<li><strong>All assistant turns hit SAIA / GWDG via LiteLLM.</strong> SAIA is operated by GWDG, <a href="https://docs.hpc.gwdg.de/services/ai-services/saia/index.html">vetted by DLR</a>, and integrated with the DLR IdP federation — <strong>approved partner for DLR-context work</strong> like LUMEN. SAIA is registered as a LiteLLM backend in this homelab and serves as the terminal endpoint of the fallback chains for the free-tier Qwen / Llama models (see <code>services/litellm.md</code>).</li>
<li><strong>Cerebras / Gemini / Mistral</strong> were NOT reached in either session — they're configured as fallbacks ahead of SAIA, but SAIA is preferred and was used directly.</li>
<li><strong>The <code>DAYTONA_API_KEY</code> env var is still in the LobeHub container</strong> after Daytona's decommissioning on 2026-05-20. Trivial cleanup.</li>
</ul>
<h2 id="what-this-means-for-policy">What this means for policy<a class="headerlink" href="#what-this-means-for-policy" title="Permanent link">&para;</a></h2>
<h3 id="permanent-fixes">Permanent fixes<a class="headerlink" href="#permanent-fixes" title="Permanent link">&para;</a></h3>
<ol>
<li><strong>Disable <code>lobe-cloud-sandbox</code></strong> — remove a whole class of leak; nothing was gained by having it that the local Coder <code>mcp-sandbox</code> template can't replicate.</li>
<li><strong>Pin LobeHub egress to LiteLLM only</strong> — single chokepoint; easier to audit, swap, and route.</li>
<li><strong>Default sensitive chats to a model with no cloud-sandbox affinity</strong> — operationally enforce via system-prompt prefixes or LobeHub agent presets.</li>
</ol>
<h3 id="capability-gaps-to-close">Capability gaps to close<a class="headerlink" href="#capability-gaps-to-close" title="Permanent link">&para;</a></h3>
<ol>
<li><strong>S3-backed artifact store</strong> — fixes the broken picture rendering AND gives every AI surface (LobeHub, Coder, n8n agents, MCP gateway) a uniform "show me a thing in a browser" channel. See <code>data-leak-audit-2026-05-21-tr004-artifacts.md</code> § "Fix: S3 as a data-exchange hub" for design.</li>
</ol>
<h3 id="defense-in-depth">Defense in depth<a class="headerlink" href="#defense-in-depth" title="Permanent link">&para;</a></h3>
<ol>
<li><strong>UDM egress firewall</strong> blocking <code>api.cerebras.ai</code>, <code>api.lobehub.com</code>, <code>*.codesandbox.io</code> unless explicitly whitelisted per request.</li>
<li><strong>Local LLM</strong> (e.g. <code>qwen3-coder-30b</code> on Arc via ollama/vllm) so the truly sensitive subset doesn't leave at all.</li>
</ol>
<h2 id="action-backlog-cumulative-deduped">Action backlog (cumulative, deduped)<a class="headerlink" href="#action-backlog-cumulative-deduped" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a>[no prereqs — start any]
<a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a>├── A. Disable lobe-cloud-sandbox in LobeHub (CT 104 env, ~10 min)
<a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a>├── B. Pin LobeHub to LiteLLM only (CT 104 env, ~15 min)
<a id="__codelineno-0-4" name="__codelineno-0-4" href="#__codelineno-0-4"></a>├── C. Local LLM behind LiteLLM (ollama / vllm + Arc) (~1-2 h)
<a id="__codelineno-0-5" name="__codelineno-0-5" href="#__codelineno-0-5"></a>├── D. Default sensitive chats to qwen3-coder (LobeHub preset) (~30 min)
<a id="__codelineno-0-6" name="__codelineno-0-6" href="#__codelineno-0-6"></a>├── E. Egress firewall block on UDM (operator OK, ~30 min)
<a id="__codelineno-0-7" name="__codelineno-0-7" href="#__codelineno-0-7"></a>├── F. Remove stale DAYTONA_API_KEY (CT 104 env, trivial)
<a id="__codelineno-0-8" name="__codelineno-0-8" href="#__codelineno-0-8"></a>└── G. Fix s3.nuclide.systems route (Zoraxy — needs operator OK)
<a id="__codelineno-0-9" name="__codelineno-0-9" href="#__codelineno-0-9"></a> └── H. chat-artifacts bucket + ACL + lifecycle (Garage)
<a id="__codelineno-0-10" name="__codelineno-0-10" href="#__codelineno-0-10"></a> ├── I. upload_artifact MCP server (CT 104 gateway)
<a id="__codelineno-0-11" name="__codelineno-0-11" href="#__codelineno-0-11"></a> ├── J. LobeHub Artifacts → S3 (TypeScript patch)
<a id="__codelineno-0-12" name="__codelineno-0-12" href="#__codelineno-0-12"></a> └── K. Coder savefig helper in dotfiles
</code></pre></div>
<h2 id="method">Method<a class="headerlink" href="#method" title="Permanent link">&para;</a></h2>
<p>Both audits used the same workflow:
1. Parse the LobeHub-exported JSON (<code>messages[]</code>).
2. Bucket by <code>role</code> and <code>plugin.identifier</code> / <code>plugin.apiName</code>.
3. Regex-extract all referenced URLs; categorize hosts as LAN vs off-host.
4. Cross-check live infrastructure:
- <code>docker exec lobehub env</code> — provider keys SET
- <code>docker exec litellm grep</code> of <code>proxy_server_config.yaml</code> — model routing
- <code>ss -tnp state established</code> from CT 104 — live outbound (snapshot only)
5. Score per channel: (sensitivity × likelihood) → criticality.
6. Recommend mitigations with effort estimates and dependency tree.</p>
<p>Audit artifacts at <code>/root/.claude/uploads/...</code> (transcripts), reports under <code>/docs/security/</code>.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8z"/></svg>
Back to top
</button>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "../..", "features": ["navigation.tabs", "navigation.sections", "navigation.expand", "navigation.top", "search.highlight", "search.suggest", "content.code.copy"], "search": "../../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>