메뉴
HN
Hacker News 22일 전

AI 에이전트 위험 기능 스캔 및 통제 오픈소스 보안 계층

IMP
7/10
핵심 요약

AI 에이전트가 기존 프레임워크(LangChain, CrewAI 등)에서 작동할 때 위험한 행동(데이터 삭제, 금전 이동 등)을 막고 통제하는 오픈소스 보안 계층인 'MakerChecker'가 공개되었습니다. 코드 스캐너, 임베디드 통제 모듈, 서버를 통해 에이전트의 권한을 최소화하고 모든 작업 내역을 암호화된 감사 로그로 남겨 인간의 승인 없이는 위험한 행동을 할 수 없도록 설계되었습니다.

번역된 본문

🛡️ MakerChecker: AI 에이전트를 위한 오픈소스 보안 계층입니다. 기본적으로 모든 접근을 거부(Deny-by-default)하고, 인간의 승인을 요구하며, 암호화 서명된 감사 추적(audit trail) 기능을 제공합니다. 따라서 에이전트는 부여받은 작업만 수행하며, 구조적으로 자신의 작업을 스스로 승인할 수 없습니다.

웹사이트 · 라이브 데모 · mc scan · 문서

에이전트는 기존 프레임워크(LangChain, Claude SDK, CrewAI)를 그대로 사용하며 작동합니다. MakerChecker는 모든 도구 호출(tool call) 앞단에서 검문소 역할을 하고, 뒷단에서는 서명된 원장(ledger) 역할을 합니다. 에이전트는 오직 부여된 '역할(role)'을 통해서만 행동하고, 허용받은 '스킬(skill)'만 실행하며, 한계를 초과할 수 없고 자신의 작업을 승인할 수 없습니다.

🚀 빠른 시작

1 — 코드 스캔 에이전트가 자율적으로 수행할 수 있는 작업을 리스크별로 분류하여 찾아냅니다. 별도 설치가 필요 없으며 데이터는 로컬을 벗어나지 않습니다: npx @makerchecker/scan 이 도구는 데이터 삭제, 자금 이동, 셸 명령 실행, 비밀 정보 유출 등 중대한 결과를 초래하는 모든 행동에 플래그를 지정합니다. 실제 사고 사례와 유사한 이름을 붙여주며, --fix 명령어를 통해 거버넌스 코드를 자동으로 작성해 줍니다. → packages/scan

2 — 동작 보장 컨트롤을 가져와서(impoert) 모든 도구를 감쌉니다. 이제 에이전트는 해당 역할에 부여된 작업만 실행할 수 있으며, 허용되지 않은 호출은 실행 전에 차단됩니다: npm i @makerchecker/embedded import { createGovernor , GovernanceDeniedError } from "@makerchecker/embedded"; const gov = createGovernor() .defineSkill("place-order@1", { riskTier: "high" }) .defineRole("agent") .defineRole("risk-desk") .grant("risk-desk", "place-order@1") // 에이전트에게는 부여하지 않음 — 기본 거부 .defineAgent("trader", "agent"); // 도구를 한 번만 감싸세요. 이제 에이전트는 구조적으로 이 도구를 실행할 수 없습니다. const placeOrder = gov.governedTool("trader", "place-order@1", (order) => broker.submit(order)); try { await placeOrder({ symbol: "BTC", qty: 10 }); } catch (err) { if (err instanceof GovernanceDeniedError) console.log(err.code); // "skill_not_granted" } 고위험 스킬은 별도의 역할로 분리되어 에이전트가 자신의 작업을 결코 승인할 수 없도록 합니다. 그리고 승인되었든 거부되었든 모든 결정은 서명된 감사 로그에 기록됩니다. → packages/embedded

3 — 감사자와의 협업 2단계에서 이미 서명된 로그가 작성됩니다. 감사자가 내구성 있고 쿼리 가능하며 위변조를 방지할 수 있는 기록과 인간 승인 받은 편지함 및 검토 콘솔이 필요한 경우, 자체 호스팅 서버를 실행하세요: docker compose up 모든 결정은 Ed25519으로 서명되고 해시 체인으로 연결되어, 어떤 열이라도 변경하면 검증이 실패합니다. 번들을 내보내기 하면 아무도 데이터베이스나 생성 과정에 대한 신뢰 없이 오프라인으로 이를 검증할 수 있습니다. → 하단의 전체 서버 설정 참조

이들은 동일한 통제 권한을 적용하고 동일한 서명된 감사 형식으로 기록하는 세 개의 독립적인 패키지(mc scan, @makerchecker/embedded, 서버)입니다. 이 중 하나만 개별적으로 도입할 수도 있습니다.

🔬 통제되는 사용 사례 인간의 승인 게이트 뒤에서 중요한 업무를 수행하는 에이전트의 실행 가능한 예시들:

  • 약물 안전성(Pharmacovigilance) 사례 처리: 에이전트가 이상 반응 보고서를 선별하지만, 의료 검토자가 서명하기 전까지는 가속화된 15일 규제 보고서가 전송되지 않습니다. → examples/pv-icsr-processing
  • 의료기기(MDR) 불만 선별: 규제 담당관이 보고서 초안이 생성되기 전 게이트 뒤에서 보고 가능성을 결정합니다. → examples/mdr-reportability-triage
  • 종양학 환자 접근성: 에이전트가 혜택 매칭을 처리하지만 전문가가 서명하지 않으면 본인 부담금 등록 제출이 차단됩니다. → examples/oncology-patient-access
  • 일일 현금 조정: 재무 에이전트가 거래를 조정하지만 자금 담당자가 서명하기 전까지는 예외 게이트에서 잠겨 있습니다. → examples/daily-cash-reconciliation

🔌 프레임워크와의 통합 기존에 사용하던 도구들을 통제하는 드롭인(drop-in) 커넥터를 제공합니다:

  • LangChain → packages/connector-langchain
  • Claude Agent SDK → packages/connector-claude-agent
  • TypeScript / Python SDKs → packages/sdk · packages/sdk-python

서버를 실행하면 SDK의 governedTool이 중앙 집중식 인가와 기록을 위해 각 호출을 프록시 세션으로 라우팅합니다: import { createClient , governedTool , GovernanceDeniedError } from "@makerchecker/sdk"; const client = createClient( {

원문 보기
원문 보기 (영어)
🛡️ MakerChecker The open-source security layer for AI agents. Deny-by-default enforcement, human approvals, and a cryptographically signed audit trail — so your agent runs only what it's granted and provably can't approve its own work. Website · Live Demo · mc scan · Docs Your agents keep running in their existing framework (LangChain, Claude SDK, CrewAI). MakerChecker sits in front of every tool call as a checkpoint and behind it as a signed ledger: an agent acts only through a role , runs only the skills it was granted , cannot exceed its limits, and cannot approve its own work. 🚀 Quick Start 1 — Scan your code Find what your agent can already do on its own, classified by risk. No install, nothing leaves your machine: npx @makerchecker/scan . It flags every consequential action — deleting data, moving money, running shell commands, exfiltrating secrets — names each against the real incident it resembles, and can write the governance code for you with --fix . → packages/scan 2 — Guarantee its behavior Import the controls and wrap any tool. The agent can now only run what its role was granted — a call it isn't allowed is denied before it executes: npm i @makerchecker/embedded import { createGovernor , GovernanceDeniedError } from "@makerchecker/embedded" ; const gov = createGovernor ( ) . defineSkill ( "place-order@1" , { riskTier : "high" } ) . defineRole ( "agent" ) . defineRole ( "risk-desk" ) . grant ( "risk-desk" , "place-order@1" ) // the agent is NOT granted it — deny by default . defineAgent ( "trader" , "agent" ) ; // Wrap your tool once. Now the agent structurally can't fire it. const placeOrder = gov . governedTool ( "trader" , "place-order@1" , ( order ) => broker . submit ( order ) ) ; try { await placeOrder ( { symbol : "BTC" , qty : 10 } ) ; } catch ( err ) { if ( err instanceof GovernanceDeniedError ) console . log ( err . code ) ; // "skill_not_granted" } High-risk skills go to a separate role, so an agent can never approve its own work — and every decision, allowed or denied, commits to a signed audit log. → packages/embedded 3 — Working with auditors? Step 2 already writes a signed log. When auditors need a durable, queryable, tamper-evident record — plus a human-approval inbox and a review console — run the self-hosted server: docker compose up Every decision is Ed25519-signed and hash-chained: change any row and verification breaks. Export a bundle and anyone verifies it offline — no database, no trust in the process that produced it. → full server setup below These are three independent packages — mc scan , @makerchecker/embedded , and the server — that enforce the same controls and write the same signed audit format. Adopt any one on its own. 🔬 Governed Use Cases Runnable examples of agents doing consequential work behind a human gate: Pharmacovigilance case processing — an agent triages adverse-event reports, but a medical reviewer signs before an expedited 15-day regulatory report transmits. examples/pv-icsr-processing Medical-device (MDR) complaint triage — a regulatory officer decides reportability behind a gate before draft reports are generated. examples/mdr-reportability-triage Oncology patient access — an agent handles benefit matching but is blocked from submitting copay enrollments without a specialist signing. examples/oncology-patient-access Daily cash reconciliation — a finance agent reconciles transactions but locks at exception gates until a cash officer signs off. examples/daily-cash-reconciliation 🔌 Integrate With Your Framework Drop-in connectors govern the tools you already have: LangChain → packages/connector-langchain Claude Agent SDK → packages/connector-claude-agent TypeScript / Python SDKs → packages/sdk · packages/sdk-python When you run the server, the SDK's governedTool routes each call through a proxy session for centralized authorization and recording: import { createClient , governedTool , GovernanceDeniedError } from "@makerchecker/sdk" ; const client = createClient ( { baseUrl : "http://localhost:3000" , apiKey : "mk_..." } ) ; const { session } = await client . proxy . openSession ( { label : "recon-run" } ) ; const match = governedTool ( client , session . id , "recon-preparer" , // agent whose role grants are evaluated "txn-match@1" , // skillRef: name @version ( input ) => matchTxns ( input ) , ) ; await match ( { statement , ledger } ) ; // throws GovernanceDeniedError if denied await client . proxy . closeSession ( session . id ) ; 🖥️ Self-Hosted Server (optional) Run the full gateway when you need centralized enforcement across many agents, a human-approval inbox, and a review console. docker compose up brings up Postgres, the server on localhost:3000 , and a seeded demo, printing two API keys — an admin key (your agent authenticates runs) and an officer key (a human reviewer approves gated actions). The seeded pharmacovigilance flow parks at a medical-review gate where the requester is refused as its own approver: export H= ' authorization: Bearer mk_... ' # admin key export OFFICER= ' authorization: Bearer mk_... ' # officer key curl -X POST localhost:3000/api/flows/pv-icsr-processing/runs -H " $H " -H ' content-type: application/json ' -d ' {} ' curl localhost:3000/api/approvals -H " $H " # The requester cannot approve their own run — rejected with 403 curl -X POST localhost:3000/api/approvals/ < id > /decision -H " $H " -H ' content-type: application/json ' \ -d ' {"decision":"approved","reason":"self-approval attempt"} ' # A separate officer signs; only now does the action proceed curl -X POST localhost:3000/api/approvals/ < id > /decision -H " $OFFICER " -H ' content-type: application/json ' \ -d ' {"decision":"approved","reason":"Seriousness confirmed; file 15-day expedited ICSRs."} ' curl localhost:3000/api/audit/verify -H " $H " Full setup, Kubernetes/Helm, and running with live models: docs/quickstart.md . 🔒 Verifiable Audit Trail Every decision and tool call commits to a hash-chained log — each event a SHA-256 over the RFC 8785 canonical JSON of the event, chained through prev_hash from genesis and Ed25519-signed. Change any row and verification breaks. Anyone can verify an exported bundle offline — no database, and no trust in the process that produced it: npx @makerchecker/proof-verifier verify bundle.json Spec: docs/audit-spec.md . 🗂️ Packages Package License What it is packages/scan Apache-2.0 mc scan — finds and classifies what your agent can do. packages/embedded Apache-2.0 Importable enforcement primitives — governance in your code. packages/proof-verifier Apache-2.0 Independently verify a signed audit bundle offline. packages/sdk Apache-2.0 TypeScript client + governedTool for the server. packages/sdk-python Apache-2.0 Python client + governed_tool . packages/connector-langchain Apache-2.0 Govern LangChain tools. packages/connector-claude-agent Apache-2.0 Govern Claude Agent SDK tools. packages/server AGPL-3.0 Self-hosted Fastify + Postgres gateway, flow engine, audit writer. packages/web AGPL-3.0 React console: approvals inbox, run log, registry. packages/shared AGPL-3.0 Domain types, canonical JSON, crypto utilities. 📄 License & Contributing Server, Web, Shared: AGPL-3.0 . mc scan , embedded , SDKs, connectors, examples: Apache-2.0 — embed them in closed-source agents freely. Commercial (non-copyleft) licensing: hello@makerchecker.ai . Contributing: CONTRIBUTING.md · Security: SECURITY.md · Code of Conduct: CODE_OF_CONDUCT.md