2026년 7월
원격 MCP 엔드포인트 — https://vdb.ai.kr/mcp (설치 불필요)
설치 없이 URL만으로 VDB에 연결하는 원격 MCP 엔드포인트를 열었습니다. streamable HTTP를 지원하는 MCP 클라이언트(Claude Desktop/Cursor 등)에 { "vdb": { "url": "https://vdb.ai.kr/mcp" } } 한 줄이면 도구 6종(패키지/벌크 체크·조회·검색·MCP 서버 신뢰도·슬롭 목록)을 바로 씁니다. 익명 세션은 IP당 무료 체험을 공유하고, 각 사용자가 자기 API 키를 세션 설정으로 넣으면 계정 단위로 집계됩니다. uvx vdb-mcp(로컬)도 그대로 사용 가능.
vdb-mcp 0.1.1 — PyPI 게시 + 공식 MCP 레지스트리(kr.ai.vdb/vdb) 등재
vdb-mcp가 PyPI에 게시되어 어떤 MCP 클라이언트든 "uvx vdb-mcp" 한 줄로 VDB에 연결됩니다. 공식 MCP 레지스트리(registry.modelcontextprotocol.io)에도 vdb.ai.kr 도메인 인증(DNS, ed25519)으로 kr.ai.vdb/vdb 네임스페이스에 등재 완료 — 레지스트리를 크롤링하는 디렉터리들(PulseMCP, Glama 등)에 자동 수록됩니다. 라이선스는 Elastic License 2.0: 기업 내부 사용 포함 자유, 관리형 서비스 재판매만 금지.
llms.txt 추가 + 취약점 페이지 “빠른 조치” 인용 블록
AI 크롤러가 하루 수백 IP 규모로 취약점 페이지를 색인 중이라, 답변 엔진(ChatGPT/Claude/Perplexity)이 VDB를 정확히 인용하도록 /llms.txt(사이트 안내 + 에이전트용 API 요약 + 인용 규칙)를 추가하고, 각 취약점 페이지 상단에 어드바이저리 ID·패키지·업그레이드 명령을 한 문장으로 담은 “빠른 조치” 블록을 넣었습니다.
vdb-mcp 패키지화(uvx 한 줄 설치) + SBOM 스캔 GitHub Action
MCP 서버를 pip 설치 가능한 vdb-mcp 패키지로 재구성했습니다 — 클라이언트 설정에 "uvx vdb-mcp" 한 줄이면 끝, 기본값이 공개 인스턴스(vdb.ai.kr)라 설정이 필요 없습니다(도구 6종: 패키지/벌크 체크·조회·검색·MCP 서버 신뢰도·슬롭 목록). CI용 GitHub Action도 추가: uses: 0pstech/vdb-scan-action@v1 한 스텝으로 락파일을 스캔하고 fail-on 심각도 임계값으로 빌드를 게이트하며, 잡 서머리에 어드바이저리 링크와 업그레이드 명령이 표로 출력됩니다. 익명 호출은 러너 IP 공유 특성상 무료 체험이 빨리 소진되므로 무료 API 키 사용을 권장합니다.
무료 체험 소진 응답 — AI 에이전트가 따라갈 수 있는 안내로 개편
/v1/ai/check-packages(429)와 /v1/sbom/scan(401)의 체험 소진 응답을 개편했습니다. 이제 항상 error: free_trial_exhausted 코드와 함께 signup_url, request_key_url, docs_url, 그리고 한/영 메시지가 담깁니다. 핵심은 request_key_url — 브라우저가 없는 AI 에이전트도 사용자 이메일만 받아 POST 하면 무료 키가 메일로 발급되는 passwordless 경로입니다. 기존 응답은 "가입하세요" 문구뿐이라 에이전트가 같은 호출을 수백 번 재시도하며 이탈했습니다.
SBOM 워치 메일 언어 — 가입한 언어를 기본값으로 사용
가입 시 사용한 언어(ko/en)를 계정에 저장하고(users.lang), SBOM 워치 등록 시 언어 신호가 없으면 이 값을 따릅니다. 우선순위: 등록 시 lang 필드 → 요청의 X-VDB-Lang/Accept-Language → 가입 언어 → ko. 이전에는 API로 등록한 워치가 무조건 한국어 메일을 받았습니다 — 영어로 가입한 계정도 이제 영어 알림을 받습니다.
SBOM 워치 — 등록한 SBOM의 의존성에 이슈가 생기면 이메일로 알림 (회원 전용)
SBOM 스캔은 "지금 이 순간"의 스냅샷만 보여줬습니다. 이제 회원가입 후 /sbom-watch에서 SBOM(또는 락파일)을 등록해 두면, 워커가 매시간 등록된 구성요소를 취약점 DB와 대조하고 새로 매칭된 어드바이저리가 있을 때만 등록된 이메일로 알려드립니다. 메일에는 사실관계(패키지·버전·심각도·KEV 여부)와 조치 방법(수정 버전, 패키지 매니저별 업그레이드 명령, 패키지 전체 안전 업그레이드 타깃)이 함께 담깁니다. 같은 (SBOM, 취약점, 패키지) 조합은 한 번만 발송 — 반복 스팸 없음. 계정당 워치 5개, 파일당 구성요소 20,000개까지. API: POST/GET/DELETE /v1/sbom/watches.
버전 리졸버 실패 시 발생하던 스캔 오탐 제거
requirements.txt / package.json처럼 고정 버전이 아닌 범위 스펙(예: >=0.115, ^0.21.0)을 스캔할 때, 레지스트리 조회가 실패(오프라인·차단·레이트리밋)하면 스펙이 구체 버전으로 확정되지 않아 안전측으로 "영향받음"이 유지되며 과탐이 발생하던 문제를 수정했습니다(예: CSRF가 0.65.2에서 이미 패치된 FastAPI가 >=0.115에서도 high로 표시). 이제 네트워크 없이도 스펙이 만족하는 전체 버전 집합이 취약 구간과 겹치지 않음을 증명 가능한 경우에만 해당 경고를 제외합니다. 단방향 판정이라 오탐만 제거하고 실제 취약점(미탐)은 절대 놓치지 않습니다.
업스트림 데이터 결함 어드바이저리 오탐 수정 (uvicorn CVE-2020-7694)
GHSA-33c7-2mpw-hg34(uvicorn 로그 주입)이 업스트림 GHSA/OSV에 "전 버전 영향, 패치 없음"으로 잘못 기록되어 모든 uvicorn 버전이 high로 표시되던 문제를 수정했습니다. 실제 패치(0.11.7) 이후 버전은 더 이상 플래그되지 않으며, 보정이 적용된 결과에는 override_note 필드로 사유가 함께 제공됩니다.
2026년 6월
VS Code · Cursor 익스텐션 출시 — 편집 중 슬롭스쿼팅·CVE·레지스트리 위험 인라인 검사
package.json·requirements.txt·Cargo.toml·go.mod·SBOM을 열거나 저장하면 의존성을 추출해 POST /v1/ai/check-packages로 점수화하고 에디터에 인라인 표시합니다. 슬롭스쿼팅(존재하지 않는 패키지명)은 에러로, 알려진 CVE는 한 번에 안전 버전으로 올리는 퀵픽스를 제공합니다. 무계정으로 바로 사용. Marketplace · Open VSX 게시.
SBOM 업로드 — 비정상 파일/거대 SBOM/심층 중첩 방어 5단 강화
/v1/sbom/scan 업로드 경로에 동심원 방어선 추가. (1) 읽기 전에 Content-Length 사전 차단(20MB), (2) 실제 read도 동일 캡으로 제한해 거짓말한 본문 차단, (3) 파일명 sanitize — basename만 추출, ../, NUL, 제어바이트 제거, 255자 cap, (4) 파서 단계에서 RecursionError / MemoryError 까지 400/413으로 회수 (deeply-nested / billion-laughs 같은 적대적 입력 차단), (5) purl/version 1024자 초과·제어바이트 포함 항목 드롭 + 호출당 컴포넌트 cap (익명 5,000개, 인증 20,000개). 응답에 components_truncated 필드 추가 — 드롭되거나 cap에 걸린 항목 수를 알려줘서 클라이언트가 "SBOM 쪼개서 다시 보내야 하나" 판단 가능. 추가로 _safe_filename + _filter_safe_purls 단위 테스트 14개.
SBOM 스캔 — IP당 3회 무료 시도 + 소진 시 친절한 401 (signup 안내 포함)
/v1/sbom/scan을 호출하려면 회원가입이 필수였는데, 첫 호출에서 "missing bearer token" 401만 봐서 왜 거절됐는지 파악이 어려웠습니다. 이제 익명 호출도 IP당 평생 3회까지 실제 응답을 받아볼 수 있고(체크패키지는 50회), 응답에 trial { used, limit, remaining } 블록이 함께 옵니다. 3회 소진 후엔 401 + { error: "free_trial_exhausted", message, signup_url, docs_url }로 정확히 무엇이 필요한지 알려줍니다. SBOM이 체크패키지보다 빡빡한 이유는 임의 파일 파싱 + 대량 vuln JOIN 비용 때문. /api 문서에도 동일 안내 + 응답 예시 갱신.
소개 페이지 — 데이터 출처 표에 CISA KEV / FIRST EPSS 추가
/about 페이지 하단 "data sources" 표에 두 신호의 업스트림(CISA Known Exploited Vulnerabilities, FIRST EPSS)을 명시했습니다. 매일 1회 갱신 cadence와 출처 링크가 함께 노출되어, 응답에 붙은 kev / epss 필드가 어디서 오는지 사용자가 직접 확인할 수 있습니다. 응답 예시 JSON도 두 필드를 포함하도록 업데이트.
CISA KEV + FIRST EPSS 신호 — check-packages / SBOM 응답에 노출
매일 새벽 CISA Known Exploited Vulnerabilities(현재 ~1.1k건) 및 FIRST EPSS 점수(~250k CVE)를 수집해 ai_signals에 업서트합니다. /v1/ai/check-packages와 /v1/ai/sbom-scan은 각 취약점마다 kev (boolean) + epss (0..1) 필드를 함께 반환합니다. KEV=true이거나 EPSS≥0.5면 베이스 CVSS와 무관하게 risk=high로 승격 — Standard 티어 사용자도 "낮은 CVSS지만 실제 익스플로잇 진행 중" 케이스를 자동으로 잡아냅니다. 응답 정렬도 KEV → EPSS → CVSS 순으로 바뀌어서, 상위 3개만 보는 클라이언트도 올바른 1순위를 받습니다.
데이터 마일스톤 — AI 데이터셋 500k건 돌파
누적 수집된 AI 데이터셋 건수가 500,000건을 처음으로 넘었습니다. 자동 기록된 항목입니다.
데이터 마일스톤 — AI 모델 500k건 돌파
누적 수집된 AI 모델 건수가 500,000건을 처음으로 넘었습니다. 자동 기록된 항목입니다.
데이터 마일스톤 — 취약점 250k건 돌파
누적 수집된 취약점 건수가 250,000건을 처음으로 넘었습니다. 자동 기록된 항목입니다.
푸터에 제휴/서비스 문의 라인 추가 (customer@opstech.kr)
카피라이트·버그 리포트 옆에 한 칸 더. 이메일은 mailto: 링크 + 고정폭 글꼴. 좁은 화면에서는 flex-wrap.
한·영 페이지 혼재 전면 수정 (account / login / signup / verify / connect / api / admin)
/en/* 미러에 한국어 텍스트가 박혀 있던 20개 페이지를 일괄 정리. i18n 사전에 90+ 키 추가. 앞으로 페이지 수정 시 ko/en 양쪽 점검을 SOP로 고정.
패키지 매칭 정확도 — crates.io / RubyGems / Go 등 사용자 입력을 purl-spec 표준 타입으로 자동 변환
사용자가 pkg:crates.io/tokio 로 보내면 내부에서 pkg:cargo/tokio 로 변환해 매칭. 이전엔 false-negative 발생.
2026년 5월
Reachability 프롬프트 분리 — 회원 전용 Standard + Reachability (§11)
CVE가 있어도 사용자 코드가 vulnerable 함수에 닿지 않으면 advisory로 다운그레이드. false-positive 감소.
MCP 서버 — scope drift 감지 + pkg:mcp/ 식별자 지원
minor 업데이트에서 권한이 조용히 추가되는 패턴을 감지해 응답에 scope_drift 필드로 노출.
AI 데이터셋 게이트 — pkg:data// 로 라이선스·PII 신호 통합 검사
Hugging Face 데이터셋 전체 카탈로그를 mirror. weights_format·license와 함께 단일 API로 평가.
SBOM 머지 게이트 — coverage_ratio 노출 + 자체 SBOM /sbom.cdx.json 공개
락파일 스캔 시 VDB가 알고 있는 컴포넌트 비율 surface. 외부 검증을 위한 자체 SBOM도 공개.