Severance: 취약점을 설명하고 수정 사항을 테스트하는 IAM 보안 에이전트
요약
Severance는 IAM(Identity and Access Management) 환경의 보안 취약점을 분석하는 AI 에이전트입니다. 이 에이전트는 복잡한 권한 그래프를 조사하여 취약점 경로를 설명하고, 위험을 제거할 특정 관계 변경 사항을 제안합니다. 특히 FalkorDB라는 데이터베이스를 활용해 제안된 변경 사항의 영향을 사전에 테스트함으로써 안전성을 확보합니다.
핵심 포인트
- Severance는 IAM 그래프를 분석하는 AI 에이전트입니다.
- 취약점 경로 설명 및 제거할 특정 관계를 제안합니다.
- FalkorDB를 사용하여 변경 사항을 시뮬레이션하고 테스트합니다.
- 도달 가능성 쿼리 등을 통해 최단 노출 경로를 찾습니다.
보안 취약점은 무언가가 노출되었다고 알려줍니다. 하지만 일반적으로 어떤 관계를 변경해야 할지, 그리고 합법적인 접근을 방해하지 않으면서 어떻게 해야 하는지는 알려주지 않습니다.
IAM(Identity and Access Management) 환경에서 접근 권한은 사용자, 그룹, 역할, 공유 정책 등을 거쳐 전달될 수 있습니다. 독립적으로는 무해해 보이는 권한이라도 여러 다른 관계와 결합되면 위험해질 수 있습니다. 발견하는 첫 번째 연결 고리를 제거하면 취약점이 막힐 수도 있지만, 유지되어야 할 접근을 끊어버릴 수도 있습니다.
저희는 이러한 문제를 조사하기 위해 Severance를 구축했으며, Graph Hacks의 Track 01: Connected Data에 따라 행동하는 에이전트(Agents That Act on Connected Data) 트랙에 참여하게 되었습니다.
Severance는 IAM 그래프를 조사하고, 취약점 뒤에 숨겨진 경로를 설명하며, 제거할 특정 관계를 제안하고, 승인을 요청하기 전에 그 변경 사항을 테스트하는 AI 에이전트입니다.
현재 구현은 오프라인 FalkorDB 모델에서 작동합니다. AWS 권한을 직접 변경하지는 않습니다.
그래프가 증거를 제공합니다
저희는 언어 모델에 도구 선택과 결과 설명의 책임을 부여했습니다. 도달 가능성(Reachability), 경로, 점수, 제안된 변경 사항은 결정론적 코드와 FalkorDB 쿼리에서 나옵니다.
그래프에는 다섯 가지 노드 유형이 포함됩니다:
| Node | 의미하는 바 |
|---|---|
| Principal | 사용자, 그룹, 서비스 또는 모델링된 신뢰할 수 없는 ID |
| ... | |
| 관계는 그룹 멤버십, 역할 접근, 역할 가정(role assumption), 정책 첨부(policy attachment), 허용된 작업 및 그 대상을 포착합니다. |
하나의 공개 입력 조사는 다음 체인을 따릅니다:
Compromised user
→ MEMBER_OF → Group
→ HAS_ROLE → Group permission carrier
...
권한 캐리어(permission carrier)는 사용자 및 그룹 정책 첨부를 기존 그래프 스키마에 맞게 조정합니다. 이는 추가적인 AWS 역할이 아닙니다.
이 구분이 중요합니다: 그래프는 클라우드 인프라를 조용히 발명하지 않으면서, 원본 데이터를 추론하기 쉽게 만들어야 합니다.
FalkorDB가 작업을 수행하는 곳
FalkorDB는 주요 운영 컨텍스트 레이어입니다.
매개변수화된 Cypher 쿼리는 신원 및 권한 관계를 통해 대상과 연결된 주체(principals)들을 찾습니다. 예를 들어, 도달 가능성 쿼리(reachability query)는 리소스에서 정책 및 액션 스파인(policy and action spine)을 거꾸로 따라가며 관련 역할에 도달하는 신원들을 찾아냅니다:
MATCH (res:Resource {id: $rid})<-[:TARGETS]-(act:Action)
<-[:PERMITS]-(:Policy)<-[:GRANTS]-(role:Role)
MATCH path =
...
저희는 algo.SPpaths를 사용하여 최단 노출 경로(shortest exposure paths)를 얻고, 샘플링된 사이트 간 중심성(sampled betweenness centrality)을 활용하여 핵심적인 역할을 담당하는 역할과 정책들을 식별합니다.
이후 플래너(planner)는 GRAPH.COPY를 사용하여 후보 관계 제거를 평가합니다. 각 후보는 폐기 가능한 복사본에 테스트되며, 이를 통해 동일한 도달 가능성 쿼리를 실행하여 그 효과를 측정할 수 있습니다.
FalkorDB가 없으면 Severance는 노출 경로를 설정하거나, 후보 수정 사항을 순위화하거나, 그 영향을 시뮬레이션하거나, 선택된 그래프 변경을 적용할 수 없습니다.
경로를 찾는 것이 시작일 뿐입니다
동일한 경로를 차단할 수 있는 여러 가지 다른 변경 사항들이 존재합니다. 이들 중 어떤 것을 선택할지는 각 변경 사항이 무엇을 제거하는지 측정해야 결정할 수 있습니다.
저희 플래너는 최단 비신뢰 경로(shortest untrusted paths)에 있는 엣지들을 고려하고, 다음 기준들을 사용하여 후보 차단(candidate cuts)을 순위화합니다:
- 남아있는 비신뢰 도달자(untrusted reachers)의 수.
- 닫히는 기존 최단 경로의 수.
- 손실되는 다른 모델링된 접근 권한의 양.
- 관련 역할 또는 정책들의 브로커 점수(broker score).
- 관계의 특이성 및 안정적인 최종 동점 처리 기준(tie-break).
이를 통해 저희는 모델에게 그럴듯하게 들리는 수정 사항을 선택하도록 요청하는 대신, 선언적이고 재현 가능한 결정 정책을 얻게 됩니다.
선택된 수정 사항은 승인 전에 다시 시뮬레이션됩니다. Severance는 지원 경로, 변경 전후 측정값, 그리고 어떠한 부수적인 영향(collateral impact)이 있는지 보여줍니다.
승인은 특정 계획에 바인딩되는 일회용 토큰을 생성합니다. 에이전트는 이 승인을 사용하여 다른 엣지 삭제를 적용할 수 없습니다. 비대화형 조사(Non-interactive investigations)는 기본적으로 변경 사항을 거부합니다.
추가 전용 감사 추적(append-only audit trail)은 도구 호출, 제안, 시뮬레이션, 승인 결정 및 적용된 변경 사항들을 기록합니다.
자체 시드된 시나리오를 넘어
저희는 알려진 취약점을 포함하는 네 가지 결정론적(deterministic) 시나리오로 시작했습니다. 이러한 테스트 데이터(fixtures)를 통해 정확한 경로와 예상되는 수정 사항을 확인할 수 있었습니다.
또한 Severance가 저희 프로젝트 외부에서 관리되는 데이터와도 작동할 수 있는지 테스트하고 싶었습니다.
이를 위해 Salesforce의 Cloudsplaining 저장소에서 공개 계정 권한 부여(account-authorization) 예제를 가져왔습니다. 고정된 입력에는 다음 내용이 포함되어 있습니다:
- 사용자 44명.
- 그룹 5개.
- 역할(role) 78개.
- 인라인 정책과 함께 관리형 정책 84개.
원래 파일, 소스 개정 버전(source revision), 체크섬(checksum), 그리고 상위 라이선스가 저장소에 포함되어 있습니다.
각 임포트는 하나의 구체적인 작업/리소스 요청을 평가하고, 손상되었다고 가정되는 사용자 또는 역할 세션을 명시적으로 식별합니다.
한 사례는 OverprivilegedEC2 역할을 조사합니다. 이 역할에 연결된 InsecurePolicy는 와일드카드 리소스에 대한 S3 쓰기 작업을 부여합니다. Severance는 해당 권한을 추적하고 정책을 역할에서 분리할 것을 제안합니다.
또 다른 사례는 사용자의 그룹 멤버십이 s3:*를 부여하는 정책을 따르는 경우입니다. 이 조사는 5개의 간선(edge) 설명(explanation)을 생성하며, 선택된 사용자의 멤버십을 제거할 것을 제안합니다.
이들은 검증된 프로덕션 계정 내보내기(production-account export)가 아닌 외부에서 가져온 예제 레코드입니다. 평가된 오브젝트 ARN은 객체가 존재한다는 증거가 아니라 구체적인 예제 요청일 뿐입니다.
벤치마크 결과
엔진을 실행하기 전에 소스 레코드로부터 여섯 가지 사례를 정의했습니다:
| 사례 | 예상 동작 |
|---|---|
| 역할에 연결된 S3 쓰기 | 경로를 찾고 관련 정책 분리 |
| ... | |
| 최종 실행은 결정론적 엔진 평가 30개 중 30개와 실시간 Sonnet MCP-agent 조사 6개 중 6개를 통과했습니다. |
승인된 케이스는 평가된 신뢰할 수 없는 접근자(untrusted reacher) 수를 1개에서 0개로 줄였으며, 지원되는 모델링 주체(modeled principals) 중 부수적인 손상은 없었습니다. 승인된 실행은 정확히 하나의 그래프 간선(graph edge)을 삭제했습니다. 거부 및 차단 제어는 그래프를 보존했습니다.
저장소에는 또한 **113개의 통과하는 결정론적 테스트(deterministic tests)**가 있습니다.
이러한 결과는 선택된 워크플로우가 이러한 고정 데이터(fixtures)에서 예상대로 작동함을 입증합니다. 6개 에이전트 호출은 프로덕션 정확도 추정치가 아닙니다.
이전 실행에서는 리소스 이름 조회 오류와 동시 벤치마크 그래프 간의 충돌이 노출되었습니다. 저희는 해당 결과를 유지하고, 정확한 이름 처리 및 그래프 격리(graph isolation)를 수정했으며, 최종 벤치마크를 다시 실행했습니다.
벤치마크 보고서와 호출별 증거(per-call evidence)는 저장소에서 확인할 수 있습니다.
가장 중요한 제한 사항은 권한 부여 범위입니다 (authorization scope)
IAM 스냅샷은 완전한 AWS 권한 환경이 아닙니다.
저희 임포터(importer)는 무조건적인 신원 정책 허용(unconditional identity-policy allows) 및 명시적 거부(explicit denies), 와일드카드 일치(wildcard matching), 기본 관리형 정책 버전(default managed-policy versions), 인라인 정책(inline policies), 그룹 상속(group inheritance)을 지원합니다.
관련 조건, 지원되지 않는 부정(negations), 정책 변수(policy variables), 누락된 정책 문서(missing policy documents), 및 권한 경계(permissions boundaries)는 알 수 없음(unknown) 결과를 초래합니다. 알 수 없는 선택된 신원(selected identity)은 임포트를 중단시킵니다. 다른 알 수 없는 신원은 보고되고 긍정적인 경로에서 제외됩니다.
프로젝션(projection)은 역할 신뢰 전환(role-trust transitions), 리소스 정책(resource policies), 조직 제어(organization controls), 세션 정책(session policies), 또는 실제 리소스 존재 여부를 평가하지 않습니다.
결과적으로, 긍정적인 경로는 가져온 모델에서 지원되는 신원 정책 부여를 의미합니다. 이는 AWS가 실시간 요청을 승인할 것이라는 것을 증명하지는 못합니다. 마찬가지로, 부수적 측정(collateral measurements)은 평가된 권한을 다룰 뿐, 모든 권한이나 워크로드를 다루지 않습니다.
이러한 경계를 가시적으로 유지하는 것은 프로젝트를 구축하는 데 중요한 부분이었습니다.
우리가 배운 것 (What we learned)
리소스 스코핑(Resource scoping)은 필수적입니다. 전역적으로 공유되는 s3:GetObject 노드는 정책을 관련 없는 리소스에 실수로 연결할 수 있습니다. 액션 노드들은 자신들의 대상 범위를 보존해야 합니다.
명시적 거부(Explicit denies) 역시 허용(allows)과 함께 일반적인 그래프 엣지처럼 취급될 수 없습니다. 그 효과는 지원되는 권한 투영(supported permission projection)을 구성할 때 해결되어야 합니다.
마지막으로, 그래프 복사 시뮬레이션(graph-copy simulation)은 에이전트가 제안하는 액션을 검토 가능하게 만들었습니다. 단순히 추천만 제시하는 대신, Severance는 모델에서 무엇이 변경되었고 무엇이 여전히 도달 가능한지 보여줄 수 있습니다.
이것이 우리가 구축하고자 했던 상호작용입니다: 증거(evidence), 결정 정책(decision policy), 승인(approval) 및 결과적인 변화가 모두 검사될 수 있는 조사 과정입니다.
GitHub에서 Severance 살펴보기를 통해 로컬 설정 지침, 그래프 모델, 필수 쿼리 및 벤치마크 증거를 확인하세요.
작동 프로젝트 녹화본 보기에서는 시드된 조사(seeded investigation)와 승인 및 적용을 거친 공개 스냅샷 조사(public-snapshot investigation) 모두를 다룹니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기