Taint Analysis for Graph APIs Focusing on Broken Access Control
이 논문은 그래프 API 의 접근 제어 결함을 탐지하기 위해 소스와 싱크 간의 직접적 및 간접적 오염 정보 흐름을 분석하는 정적 및 동적 오염 분석 체계적 접근법을 제시하고, 이를 GitHub GraphQL API 에 적용하여 권한이 없는 정보 접근 및 조작, 그리고 권한이 있는 정보 접근 불가라는 두 가지 유형의 접근 제어 결함을 성공적으로 식별함을 보여줍니다.
원저자:Leen Lambers, Lucas Sakizloglou, Taisiya Khakharova, Fernando Orejas
이 논문의 핵심 아이디어를 이해하기 위해 거대한 **도서관 (웹 애플리케이션)**과 **관리 시스템 (Graph API)**을 상상해 보세요.
그래프 API란?
도서관의 책들 (데이터) 이 서로 끈으로 연결되어 있는 상태입니다. '저자'는 '책'을 연결하고, '책'은 '장르'를 연결합니다. 사용자가 이 끈들을 따라가며 정보를 찾거나 수정하는 것이 API 호출입니다.
깨진 접근 제어 (Broken Access Control) 란?
도서관에는 **'비밀 구역'**이 있습니다. 일반 열람객은 들어갈 수 없지만, '도서관장'이나 '특정 관리인'만 들어갈 수 있습니다.
보안 문제는 일반 열람객이 관리인만 쓸 수 있는 '비밀 구역'에 들어가서 책을 훔치거나, 반대로 관리인이 들어갈 수 있어야 하는데 문이 잠겨 있어 못 들어가는 경우입니다.
이 논문이 제안하는 방법: '오염된 책' 추적 (Taint Analysis)
이 연구팀은 **"위험한 책 (민감한 데이터)"**에 **빨간색 스티커 (Taint, 오염)**를 붙이는 방법을 고안했습니다.
목표: 빨간 스티커가 붙은 책이 누가, 어떻게, 언제 만지작거리는지 추적하여, 권한이 없는 사람이 건드리지 않았는지 확인하는 것입니다.
🕵️♂️ 3 단계 보안 수사 과정
이 논문은 보안 수사관을 위해 3 단계로 나누어 작업을 수행합니다.
1 단계: 수사 준비 (Setup) - "스티커 붙이기"
작업: 보안 수사관 (Security Analyst) 이 도서관의 지도 (스키마) 를 보고, 어떤 책이 '민감한 정보'인지 정합니다.
비유: "이 책 (Repository, Issue 등) 은 일반인이 함부로 만지면 안 되니 빨간 스티커를 붙여라"라고 지시합니다.
결과: 이제 도서관 전체 지도에는 빨간 스티커가 붙은 책들이 표시되고, 어떤 사람이 이 책을 **만들 수 있는지 (Source)**와 **어떤 사람이 이 책을 **수정하거나 볼 수 있는지 (Sink)**를 정의합니다.
2 단계: 정적 분석 (Static Analysis) - "지도 위의 시뮬레이션"
작업: 실제 도서관을 열어보기 전에, **지도 (이론)**만 가지고 "만약 A 가 책을 만들고, 그다음 B 가 그 책을 수정하면 문제가 될까?"를 컴퓨터가 자동으로 계산합니다.
핵심 기술 (CPA): 컴퓨터는 두 가지 행동 (책 만들기, 책 수정하기) 이 서로 충돌하거나 연결될 수 있는 모든 경우를 찾아냅니다.
직접 연결: A 가 책을 만들고 바로 B 가 수정하는 경우.
간접 연결: A 가 책을 만들고, C 가 중간에 다른 일을 한 뒤 B 가 수정하는 경우.
결과: 컴퓨터는 "이 두 행동이 연결되면 위험할 수 있음 (Potential Vulnerability)"이라고 빨간불을 켭니다. 하지만 이 단계에서는 '실제로 그런 일이 일어날지'는 아직 모릅니다. (가짜 경보가 있을 수 있음)
3 단계: 동적 분석 (Dynamic Analysis) - "실제 현장 테스트"
작업: 컴퓨터가 "위험할 수 있다"고 한 곳들을 실제로 테스트해 봅니다.
비유:
양성 테스트 (Positive Test): "도서관장"이 권한을 가지고 책을 만들고 수정해 봅니다. (정상적으로 되어야 함)
음성 테스트 (Negative Test): "일반 열람객"이 권한 없이 책을 만들고 수정해 보려 합니다. (실패해야 함, 즉 "접근 불가" 메시지가 나와야 함)
결과: 만약 일반 열람객이 실제로 수정을 해버렸다면? **실제 보안 구멍 (BAC Vulnerability)**이 발견된 것입니다!
🌟 이 연구의 특별한 점 (왜 중요한가?)
첫 번째 시도: 그래프 API(특히 GraphQL) 에 대해 이런 체계적인 '오염 추적' 분석을 시도한 것은 세계 최초입니다.
실제 사례 검증: 이 방법을 **GitHub(깃허브)**의 실제 API 에 적용해 보았습니다.
결과 1: GitHub 의 기존 보안 정책이 잘 작동하는지 확인했습니다.
결과 2: GitHub 커뮤니티에서 보고된 실제 보안 문제 (Issue 106598) 를 이 방법으로 재현해 냈습니다. 즉, "어떤 토큰을 쓰느냐에 따라 권한이 다르게 적용되는 치명적인 구멍"을 찾아냈습니다.
직접 vs 간접: 단순히 바로 이어지는 행동뿐만 아니라, 중간에 다른 작업이 끼어 있는 복잡한 상황에서도 보안 구멍을 찾을 수 있도록 이론을 발전시켰습니다.
📝 한 줄 요약
"민감한 데이터에 빨간 스티커를 붙이고, 컴퓨터 시뮬레이션과 실제 테스트를 통해 권한이 없는 사람이 그 스티커를 건드리지 못하도록 막는 새로운 보안 수사법을 개발했다."
이 방법은 개발자들이 복잡한 웹 서비스에서 "누가 무엇을 할 수 있는지"를 명확히 확인하고, 해커들이 틈을 타는 보안 구멍을 미리 찾아내는 데 큰 도움이 될 것입니다.
1. 문제 정의 (Problem)
배경: 그래프 API(예: GraphQL) 는 데이터 객체를 노드, 관계를 엣지로 표현하여 소셜 네트워크 및 클라우드 컴퓨팅 애플리케이션에서 널리 사용되고 있습니다.
도전 과제: 그래프 API 는 기존 웹 애플리케이션과 다른 구조를 가지므로, 기존의 보안 분석 도구와 방법론을 직접 적용하기 어렵습니다. 특히 깨진 접근 제어 (Broken Access Control, BAC) 는 웹 애플리케이션의 가장 심각한 취약점 중 하나입니다. 이는 사용자가 권한 없이 민감한 데이터에 접근하거나 수정할 수 있게 하거나, 반대로 권한이 있는 사용자가 정상적으로 접근하지 못하는 경우를 포함합니다.
현황: 그래프 API 의 보안 분석을 위한 체계적인 방법론, 특히 정적 분석과 동적 분석을 결합하여 BAC 취약점을 탐지하는 접근법은 부재했습니다.
2. 방법론 (Methodology)
저자들은 그래프 변환 (Graph Transformation) 이론을 기반으로 한 정적 및 동적 오염 분석 (Taint Analysis) 접근법을 제안합니다. 이 방법은 크게 세 단계 (Setup, Static Analysis, Dynamic Analysis) 로 구성됩니다.
2.1. 설정 (Setup)
형식화: GraphQL 스키마를 타입 그래프 (Type Graph, TG) 로 모델링하고, API 호출 (쿼리 및 뮤테이션) 을 그래프 변환 규칙 (Graph Transformation Rules) 으로 정의합니다.
오염 (Tainting): 보안 분석가가 민감한 데이터에 해당하는 노드 (예: Repository, Issue 등) 를 '오염 (Tainted)'된 노드로 표시합니다.
소스 (Source) 와 싱크 (Sink) 식별:
Source Rule: 민감한 데이터 (오염된 노드) 를 생성하는 규칙.
Sink Rule: 민감한 데이터를 읽거나 수정/삭제하는 규칙.
접근 제어 정책: 역할 기반 접근 제어 (RBAC) 정책을 정의하여, 어떤 역할이 어떤 호출을 허용하는지 명시합니다.
2.2. 정적 분석 (Static Analysis)
의존성 분석: 생성된 오염된 그래프 API 에 대해 중요 쌍 분석 (Critical Pair Analysis, CPA) 을 수행합니다.
목표: Source 규칙과 Sink 규칙 간의 의존 관계 (Dependency) 를 자동으로 탐지합니다. 즉, 민감한 데이터가 생성된 후 다른 규칙에 의해 어떻게 사용되는지 추적합니다.
직접 및 간접 흐름:
직접 흐름: Source 규칙 직후 Sink 규칙이 실행되는 경우.
간접 흐름: Source 와 Sink 사이에 다른 규칙이 개입하는 경우.
이론적 보장: 특정 조건 (규칙의 순차적 독립성 및 정책의 이동 안정성) 하에서 정적 분석이 간접적인 취약점까지 탐지할 수 있음을 증명했습니다 (Theorem 3.13).
결과: 잠재적인 위험 흐름 (Potential BAC Vulnerabilities) 의 집합을 도출하며, 이는 분석가가 수동으로 검토해야 할 대상입니다.
2.3. 동적 분석 (Dynamic Analysis)
테스트 생성: 정적 분석에서 도출된 위험 흐름을 기반으로 구체적인 테스트 케이스를 생성합니다.
테스트 유형:
양성 테스트 (Positive Test): 권한이 있는 사용자가 민감한 데이터에 접근/수정하는 시나리오 (예상: 성공).
음성 테스트 (Negative Test): 권한이 없는 사용자가 민감한 데이터에 접근/수정하는 시나리오 (예상: 실패/권한 거부).
커버리지: 흐름 커버리지 (Flow Coverage) 와 역할 커버리지 (Role Coverage) 를 충족하도록 테스트를 설계하여, 모든 역할과 의존 관계가 테스트되도록 합니다.
실행: 실제 GitHub API 에 테스트를 실행하여 정적 분석 결과가 실제 취약점으로 이어지는지 검증합니다.
3. 주요 기여 (Key Contributions)
그래프 API 를 위한 최초의 체계적인 BAC 분석 프레임워크: 오염 분석, 그래프 기반 형식화, 그리고 정밀한 탐지를 동시에 지원하는 최초의 접근법입니다.
그래프 변환 기반의 형식적 모델링: GraphQL 스키마와 API 호출을 그래프 변환 규칙으로 매핑하여, 수학적 엄밀성을 갖춘 분석을 가능하게 했습니다.
정적 및 동적 분석의 통합:
정적 분석을 통해 잠재적 취약점을 빠르고 체계적으로 식별합니다.
동적 분석을 통해 실제 구현에서의 취약점 존재 여부를 검증합니다.
간접 취약점 탐지 이론의 확장: 기존에는 직접적인 의존 관계만 탐지 가능했으나, 논문을 통해 특정 조건 하에서 간접적인 데이터 흐름에 의한 취약점 탐지 가능성을 증명하고 확장했습니다.
실제 사례 적용 (GitHub GraphQL API):
GitHub 의 개인 계정 권한 모델에 적용하여 다양한 역할 (Owner, Collaborator 등) 간의 접근 제어 문제를 분석했습니다.
GitHub 커뮤니티에서 보고된 실제 권한 문제 (Issue #106598) 를 재현하여 방법론의 실용성을 입증했습니다.
4. 결과 (Results)
GitHub API 적용: 제안된 방법을 GitHub GraphQL API 의 일부에 적용했습니다.
탐지 성공:
정적 분석을 통해 createRepo 와 updateRepo 와 같은 민감한 데이터 흐름 간의 의존 관계를 성공적으로 식별했습니다.
동적 분석을 통해 권한이 없는 사용자 (Collaborator) 가 권한이 있는 작업 (Repository 업데이트) 을 시도할 때 시스템이 올바르게 차단하는지, 혹은 권한이 있는 사용자가 정상적으로 작업할 수 있는지 검증했습니다.
실제 취약점 재현: GitHub 의 실제 이슈 (Issue 106598) 인 OAuth 와 Fine-grained 토큰 간의 권한 차이로 인한 취약점을 분석을 통해 재현하고 검증했습니다. 이는 제안된 방법이 실제 환경의 복잡한 권한 문제를 발견할 수 있음을 보여줍니다.
정확성: 정적 분석은 위양성 (False Positive) 을 포함할 수 있으나, 동적 분석을 통해 이를 필터링하여 실제 취약점만 선별할 수 있음을 입증했습니다.
5. 의의 및 중요성 (Significance)
새로운 보안 패러다임 제시: 그래프 API 의 고유한 구조 (노드와 엣지) 를 반영한 보안 분석 방법론을 제시하여, 기존 웹 API 보안 도구의 한계를 극복했습니다.
자동화 가능성: Henshin (그래프 변환 도구) 과 Python 스크립트를 활용하여 분석 프로세스의 상당 부분을 자동화할 수 있음을 보였습니다.
실무 적용 가치: 보안 분석가가 복잡한 접근 제어 정책을 수동으로 검토하는 대신, 체계적인 도구와 테스트 케이스를 통해 취약점을 효율적으로 발견하고 수정할 수 있게 합니다.
미래 연구 방향: GraphQL 스키마에서 그래프 변환 규칙으로의 자동 변환, 더 정교한 간접 의존성 분석, 그리고 다른 도메인 (그래프 데이터베이스 등) 으로 확장 가능성을 제시했습니다.
이 논문은 그래프 API 의 보안, 특히 접근 제어 취약점에 대한 이론적 엄밀함과 실용적 검증을 결합한 중요한 연구로 평가됩니다.