Skylos
Skylos 병합 전 보안 회귀 및 위험 변경사항 탐지 도구
개인 디지털 노출을 평가하는 연구 프로토타입으로, 자격증명 노출·속성 추론·대응을 확인합니다 데이터는 저장되지 않습니다
A research prototype for assessing your own personal digital exposure: credential exposure, attribute inference, and remediation. Assess your own data only. Nothing is stored.
보안JavaScript · PythonGitHub @SocoSec온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기A self-assessment instrument for personal digital exposure, built as a research prototype. A visitor assesses their own data across three surfaces — credential exposure, account (email) exposure, and LLM attribute inference — and receives an illustrative exposure index and remediation.
README 전체를 불러오는 중입니다.
README 전문 보기 ↗A research MVP for assessing your own digital exposure: verified email breach lookups, k-anonymity password checks, a transparent Breach Risk score, a vetted action plan with residual-risk tracking, GDPR request letters, and ExpoBot — an AI assistant constrained to that action plan. MSc thesis prototype, Óbuda University.
👉 Live: https://exposurescope.vercel.app/
Research demonstrator. Not a commercial security product and not a substitute for professional security advice.
email + consent ─► /api/verify/start ─ rate limits ─► 6-digit code by email
◄─ signed CHALLENGE token (holds a keyed tag of the code, not the code)
code ───────────► /api/verify/check ─► signed SCAN token (15 min, bound to that email)
email + SCAN ───► /api/breach ─ token + rate limits + daily cap ─► HIBP / DeHashed
merge + dedupe → Breach Risk score → signed REPORT token (60 min)
question+REPORT ► /api/chat ─ context built server-side ─► Claude, agent loop
◄─ tools run on the SIGNED report (≤5 model calls) ─►
◄─ { answer, actionIds, letters, used } — all checked server-side
password ───────► (browser only) SHA-1 → first 5 chars ─► Pwned Passwords (padded)
Zero storage. No database. State that must survive between steps travels as signed, expiring tokens held in the browser's memory. The only server-side traces are rate-limit counters keyed by HMAC hashes, which expire within 24 hours.
| Path | Role |
|---|---|
lib/config.js | Every environment variable; testing switches gated to dev/preview |
lib/crypto.js | Web Crypto helpers: base64url, HMAC, keyed hashes, unbiased codes |
lib/tokens.js | Stateless signed tokens (challenge / scan / report) |
lib/ratelimit.js | Fixed-window limits (Upstash or in-memory) |
lib/http.js | JSON responses, error codes, body size caps, input normalisation |
lib/mailer.js | Verification email via Resend |
lib/sms.js | Verification SMS via Twilio (phone path; absent by default) |
lib/sources.js | HIBP + DeHashed lookups, cross-source merge, demo fixtures |
lib/score.js | Thesis Breach Risk component B (pure functions) |
lib/playbook.js | Vetted actions + residual-risk model |
lib/expobot.js | ExpoBot guard rails (trusted context, closed action set, output checks) |
lib/agent.js | ExpoBot v2: the agent's tools, its bounded loop, and output validation |
lib/gdpr.js | Article 15 / 17 request letters |
lib/content.js | Learn-tab text |
app/api/* | Thin routes wiring the libraries to HTTP |
app/page.js | The UI flow; components in app/components/ |
app/privacy/page.js | Privacy notice (must match what the code does) |
scripts/selftest.mjs | Offline tests for everything in lib/ |
scripts/redteam.mjs | Adversarial tests: a hostile model driven through the real agent loop |
npm install
cp .env.example .env.local # then set EXPOSIO_DEMO=1 and EXPOSIO_SHOW_CODE=1
npm run selftest # offline tests, no keys needed
npm run redteam # adversarial tests, no keys needed
npm run dev # http://localhost:3000
With the testing flags on, any address returns example breach data
([email protected] returns none) and the verification code appears on screen.
EXPOSIO_DEMO=1 and EXPOSIO_SHOW_CODE=1 also work on Vercel Preview
deployments, which sit behind Vercel's login — useful for showing the product
before the Resend and breach-data accounts are set up. They are ignored on
production, and the interface shows a banner whenever they are active.
EXPOSIO_SECRET, RESEND_API_KEY, EXPOSIO_FROM_EMAIL, HIBP_API_KEY
(and optionally DEHASHED_*, ANTHROPIC_API_KEY, UPSTASH_*, EXPOSIO_CONTACT_EMAIL, EXPOSIO_ETHICS_REF)./api/* as an outer layer.EXPOSIO_ETHICS_REF.ExpoBot v2 is an agent, not a chat wrapper. Rather than being told more in its prompt, it is given tools over the user's server-signed report and must look things up before it speaks:
| Tool | Answers | Computed by |
|---|---|---|
list_actions | which vetted actions apply, and what each is worth in points | lib/playbook.js |
simulate_fixes | "how much would this actually help?" | residualScore() |
breach_details | which breach drives the score, and why | lib/score.js |
respond | the final answer: action IDs + optional GDPR letters | validated server-side |
The design question is not "is the model good?" but "what can a bad model do?"
Six layers answer it, and scripts/redteam.mjs proves each one by running a
deliberately hostile model through the real loop in lib/agent.js:
BREACHES>>> … cannot
escape the fence and be read as instructions.MAX_TOOL_ROUNDS + 1 model calls, then respond is forced.npm run redteam # 18 attacks, offline, no API key
npm run redteam:live # also sends real jailbreak prompts to the live model
Live mode asserts the same containment properties against the real model — it never checks whether the model "behaved well", only whether the server let anything through.
B_raw = Σ severity × exp(−0.002 × age_days), score = min(1, B_raw / 0.8) × 100.
Severity: payment + passwords 1.0 · passwords 0.7 · phone/address 0.4 · email only 0.2.
Records without a breach date assume an age of 730 days (shown as "undated*").
The UI calls this the Breach Risk score — it is component B of the thesis Exposure
Score, whose other four components are not yet measured. Residual-risk factors in
lib/playbook.js are provisional and meant to be calibrated in a user study.