Files

2259 lines
42 KiB
HTML
Raw Permalink 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-2026-05-20-tr004-cloud-sandbox/">
<link rel="prev" href="../data-leak-audit-comparison/">
<link rel="next" href="../data-leak-audit-2026-05-21-tr004-artifacts/">
<link rel="icon" href="../../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.6">
<title>2026-05-20 · cloud-sandbox breach - 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-2026-05-20-lumen-tr-004-test-run-analysis" 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">
2026-05-20 · cloud-sandbox breach
</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="../data-leak-audit-comparison/" 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">
<a href="../data-leak-audit-comparison/" class="md-nav__link">
<span class="md-ellipsis">
Comparison
</span>
</a>
</li>
<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">
2026-05-20 · cloud-sandbox breach
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
2026-05-20 · cloud-sandbox breach
</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="#tldr" class="md-nav__link">
<span class="md-ellipsis">
TL;DR
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conversation-footprint" class="md-nav__link">
<span class="md-ellipsis">
Conversation footprint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#data-flow" class="md-nav__link">
<span class="md-ellipsis">
Data flow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-specifically-was-sent-where" class="md-nav__link">
<span class="md-ellipsis">
What specifically was sent where
</span>
</a>
<nav class="md-nav" aria-label="What specifically was sent where">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#to-saia-approved-partner-llm-inference-21-calls" class="md-nav__link">
<span class="md-ellipsis">
To SAIA (approved partner — LLM inference, 21 calls)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#to-lobehub-cloud-sandbox-unapproved-9-executecode-calls" class="md-nav__link">
<span class="md-ellipsis">
To LobeHub Cloud Sandbox (UNAPPROVED — 9 executeCode calls)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stayed-on-lan" class="md-nav__link">
<span class="md-ellipsis">
Stayed on LAN
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#criticality-matrix" class="md-nav__link">
<span class="md-ellipsis">
Criticality matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mitigations-ranked-by-impact-effort" class="md-nav__link">
<span class="md-ellipsis">
Mitigations (ranked by impact ÷ effort)
</span>
</a>
</li>
</ul>
</nav>
</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="#tldr" class="md-nav__link">
<span class="md-ellipsis">
TL;DR
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#conversation-footprint" class="md-nav__link">
<span class="md-ellipsis">
Conversation footprint
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#data-flow" class="md-nav__link">
<span class="md-ellipsis">
Data flow
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#what-specifically-was-sent-where" class="md-nav__link">
<span class="md-ellipsis">
What specifically was sent where
</span>
</a>
<nav class="md-nav" aria-label="What specifically was sent where">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#to-saia-approved-partner-llm-inference-21-calls" class="md-nav__link">
<span class="md-ellipsis">
To SAIA (approved partner — LLM inference, 21 calls)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#to-lobehub-cloud-sandbox-unapproved-9-executecode-calls" class="md-nav__link">
<span class="md-ellipsis">
To LobeHub Cloud Sandbox (UNAPPROVED — 9 executeCode calls)
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#stayed-on-lan" class="md-nav__link">
<span class="md-ellipsis">
Stayed on LAN
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#criticality-matrix" class="md-nav__link">
<span class="md-ellipsis">
Criticality matrix
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mitigations-ranked-by-impact-effort" class="md-nav__link">
<span class="md-ellipsis">
Mitigations (ranked by impact ÷ effort)
</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-2026-05-20-lumen-tr-004-test-run-analysis">Data-leak audit — 2026-05-20 · <code>Lumen TR-004 Test Run Analysis</code><a class="headerlink" href="#data-leak-audit-2026-05-20-lumen-tr-004-test-run-analysis" title="Permanent link">&para;</a></h1>
<p><strong>Conversation</strong>: <code>75fb06e8-Lumen_TR004_Test_Run_Analysis.json</code>
<strong>LobeHub session model</strong>: <code>qwen3.5-397b-a17b</code> (21 assistant turns)
<strong>Total messages</strong>: 60 (2 user · 21 assistant · 37 tool)
<strong>Auditor</strong>: agent doctrine-driven scan, 2026-05-20</p>
<h2 id="tldr">TL;DR<a class="headerlink" href="#tldr" title="Permanent link">&para;</a></h2>
<p><strong>Verdict: SENSITIVE DATA LEFT THE HOMELAB to an unapproved third party.</strong> The breach channel was <code>lobe-cloud-sandbox</code>, not the LLM inference.</p>
<p>Two off-host data flows, with very different trust profiles:</p>
<ol>
<li><strong>LLM inference via SAIA / GWDG</strong> — 21 assistant turns sent the full conversation context (incl. Shepard search results) to SAIA via LiteLLM. <strong>NOT a leak in this context</strong> — SAIA is operated by GWDG (German academic computing center, Göttingen), <a href="https://docs.hpc.gwdg.de/services/ai-services/saia/index.html">vetted by DLR</a> and integrated with the DLR IdP federation. For LUMEN (DLR engine programme) test data, SAIA is an approved partner.</li>
<li><strong><code>lobe-cloud-sandbox</code> code execution — THE BREACH.</strong> 9 calls sent Python source code (with explicit <code>LUMEN</code>, <code>P3-Lampoldshausen</code>, <code>LOX/LCH4</code> references, anomaly timings, and synthetic-but-derived-from-real timeseries) to <strong><code>api.lobehub.com</code></strong> + <strong>codesandbox.io</strong> — commercial third parties, not approved for DLR data. 4 <code>exportFile</code> calls pulled generated images back. <strong>Criticality: HIGH</strong> — proprietary aerospace IP in plaintext executable code, sent to commercial cloud.</li>
</ol>
<p>Shepard data fetches themselves stayed on LAN (<code>shepard-api.nuclide.systems</code>), but the <strong>results</strong> were re-emitted to SAIA (approved) AND to the cloud sandbox (NOT approved).</p>
<h2 id="conversation-footprint">Conversation footprint<a class="headerlink" href="#conversation-footprint" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Channel</th>
<th>Calls</th>
<th>Destination</th>
<th>Trust</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>shepard</code> MCP (<code>list_data_objects</code>, <code>get_data_object</code>, <code>list_lab_journal</code>, etc.)</td>
<td>27</td>
<td><code>shepard-api.nuclide.systems</code> (CT 101)</td>
<td>✅ LAN</td>
</tr>
<tr>
<td><code>lobe-cloud-sandbox</code> (<code>executeCode</code> + <code>exportFile</code>)</td>
<td>9</td>
<td><strong><code>api.lobehub.com</code> + codesandbox.io</strong></td>
<td><strong>unapproved third party</strong></td>
</tr>
<tr>
<td><code>lobe-agent-documents</code> (<code>listDocuments</code>)</td>
<td>1</td>
<td>LobeHub local (in-container)</td>
<td>✅ LAN</td>
</tr>
<tr>
<td>LLM inference (<code>qwen3.5-397b-a17b</code>)</td>
<td>21</td>
<td><strong>SAIA (GWDG)</strong> via LiteLLM</td>
<td>✅ approved partner (DLR-vetted, IdP-federated)</td>
</tr>
</tbody>
</table>
<h2 id="data-flow">Data flow<a class="headerlink" href="#data-flow" title="Permanent link">&para;</a></h2>
<pre class="mermaid"><code>flowchart LR
user(["You · browser"]) --&gt;|HTTPS via Zoraxy| lobe["LobeHub · CT 104"]
lobe --&gt;|MCP, internal| shep[Shepard API · CT 101]
shep --&gt;|test data, lab notes,&lt;br/&gt;investigation records| lobe
lobe --&gt;|prompt + Shepard results&lt;br/&gt;+ tool messages| litellm[LiteLLM proxy · CT 104]
litellm -.-&gt;|qwen3.5-397b-a17b&lt;br/&gt;21 inference calls| saia[(SAIA / GWDG&lt;br/&gt;academic provider)]
lobe -.-&gt;|Python source + filenames&lt;br/&gt;9 calls| sbx[(LobeHub Cloud Sandbox&lt;br/&gt;api.lobehub.com&lt;br/&gt;+ codesandbox.io)]
sbx -.-&gt;|4 generated PNGs&lt;br/&gt;back to LobeHub| lobe
classDef leak fill:#5a2a2a,stroke:#c44,color:#fcc
class saia,sbx leak
classDef ok fill:#234c2a,stroke:#4c8,color:#cfc
class shep,lobe,litellm,user ok</code></pre>
<h2 id="what-specifically-was-sent-where">What specifically was sent where<a class="headerlink" href="#what-specifically-was-sent-where" title="Permanent link">&para;</a></h2>
<h3 id="to-saia-approved-partner-llm-inference-21-calls">To SAIA (approved partner — LLM inference, 21 calls)<a class="headerlink" href="#to-saia-approved-partner-llm-inference-21-calls" title="Permanent link">&para;</a></h3>
<ul>
<li>Both user prompts verbatim.</li>
<li>All Shepard tool outputs — collections found, data-object IDs, lab journal entries for TR-004 (anomaly time, fuel turbopump vibration values, chamber pressure profile, mixture ratio, test bench naming).</li>
<li>The model's own intermediate reasoning.</li>
<li>The Python code it wrote before sending to the sandbox.</li>
<li>Sensitive strings: <code>LUMEN TR-004</code>, <code>LOX/LCH4</code>, <code>P3-Lampoldshausen</code>, <code>Fuel Turbopump Vibration Spike at t=8.0s</code>, <code>bearing replaced</code>, <code>TR-003 → TR-004 → TR-006 campaign</code>.</li>
<li><strong>Routed through LiteLLM</strong> (<code>ai.nuclide.systems</code>, CT 104) which has SAIA registered as a backend; chain logic terminates at SAIA for free academic models. See <code>services/litellm.md</code>.</li>
</ul>
<h3 id="to-lobehub-cloud-sandbox-unapproved-9-executecode-calls">To LobeHub Cloud Sandbox (UNAPPROVED — 9 <code>executeCode</code> calls)<a class="headerlink" href="#to-lobehub-cloud-sandbox-unapproved-9-executecode-calls" title="Permanent link">&para;</a></h3>
<ul>
<li>~1,500 lines of cumulative Python source containing the same identifiers.</li>
<li>Inline JSON dumps of synthetic timeseries (vibration g_rms arrays, chamber-pressure curves, gimbal angles) constructed to match the real TR-004 profile from Shepard.</li>
<li>4 generated PNGs (the dashboards) existed on the cloud sandbox's filesystem long enough to be exported back.</li>
</ul>
<h3 id="stayed-on-lan">Stayed on LAN<a class="headerlink" href="#stayed-on-lan" title="Permanent link">&para;</a></h3>
<ul>
<li>The actual raw Shepard sensor timeseries (<code>get_data_object</code> returned data IDs; what reached SAIA was the model's interpretation/summary, not raw buffers).</li>
<li>The <code>www.dlr.de</code> URLs in chat are just citations, no fetch was triggered.</li>
</ul>
<h2 id="criticality-matrix">Criticality matrix<a class="headerlink" href="#criticality-matrix" title="Permanent link">&para;</a></h2>
<table>
<thead>
<tr>
<th>Channel</th>
<th>Sensitivity</th>
<th>Likelihood</th>
<th>Trust</th>
<th>Verdict</th>
</tr>
</thead>
<tbody>
<tr>
<td>SAIA inference (via LiteLLM)</td>
<td>High (proprietary test analysis)</td>
<td>100% (every chat)</td>
<td>✅ approved partner (DLR-vetted)</td>
<td><strong>OK</strong></td>
</tr>
<tr>
<td>lobe-cloud-sandbox</td>
<td>High (Python referencing program data)</td>
<td>100% in this chat</td>
<td>❌ unapproved (commercial cloud)</td>
<td><strong>BREACH</strong></td>
</tr>
<tr>
<td>Other LobeHub providers (Gemini/Cerebras/Mistral)</td>
<td>High</td>
<td>Latent — fallback only</td>
<td>❌ commercial</td>
<td>MEDIUM (latent risk)</td>
</tr>
<tr>
<td>Shepard MCP fetches</td>
<td>Internal only</td>
<td>Every related chat</td>
<td>✅ LAN</td>
<td>LOW</td>
</tr>
<tr>
<td>Stale <code>DAYTONA_API_KEY</code></td>
<td>None</td>
<td>Never used</td>
<td>n/a</td>
<td>trivial cleanup</td>
</tr>
</tbody>
</table>
<h2 id="mitigations-ranked-by-impact-effort">Mitigations (ranked by impact ÷ effort)<a class="headerlink" href="#mitigations-ranked-by-impact-effort" title="Permanent link">&para;</a></h2>
<ol>
<li><strong>Disable <code>lobe-cloud-sandbox</code> in LobeHub</strong> (highest single-step risk reduction). Use the <code>mcp-sandbox</code> Coder workspace template instead — already built, ephemeral, GPU-passthrough, sci-stack pre-baked, all local. <em>Effort: 10 min.</em></li>
<li><strong>Pin LobeHub to LiteLLM only</strong>. Remove per-provider <code>*_API_KEY</code> env vars. <em>Effort: 15 min.</em></li>
<li><strong>Add a local-LLM route to LiteLLM</strong> for sensitive workloads (qwen3-coder-30b via ollama/vllm on Arc). <em>Effort: 12 h.</em></li>
<li><strong>Tag chats by sensitivity, enforce model routing.</strong> <em>Effort: research first.</em></li>
<li><strong>Network egress firewall</strong> on UDM blocking <code>api.cerebras.ai</code> + <code>api.lobehub.com</code> + <code>codesandbox.io</code>. <em>Effort: 30 min.</em></li>
<li><strong>Remove stale <code>DAYTONA_API_KEY</code></strong> from LobeHub env. Trivial.</li>
</ol>
<p>See also: <a href="../data-leak-audit-2026-05-21-tr004-artifacts/"><code>data-leak-audit-2026-05-21-tr004-artifacts.md</code></a> for the next day's session with a different model, and <a href="../data-leak-audit-comparison/"><code>data-leak-audit-comparison.md</code></a> for the side-by-side.</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>