static-analysis

12 개의 포스트

gitlab3분 읽기큐레이션 요약

GitLab은 리팩터링과 코드 재서식을 통해 취약점을 추적하는 방법

GitLab은 코드 위치나 줄 번호가 바뀌어도 동일한 취약점을 안정적으로 추적하기 위해 Scope+Offset 핑거프린팅을 개선했습니다. 기존 방식은 주석과 빈 줄도 오프셋에 포함해 비기능적 수정만으로 중복 취약점을 만들 수 있었지만, 개선된 방식은 이를 무시합니다. 벤치마크에서 중복 핑거프린트를 제거하고 고유 핑거프린트를 43% 줄였으며, `scope_offset_compressed` 알고리즘으로 GitLab에 적용되었습니다. ## 코드 변경으로 발생하는 취약점 추적 문제 - 개발자가 주석을 추가하거나 파일을 재포맷하거나 함수를 이동하면 코드 줄 번호가 달라질 수 있습니다. - 줄 번호만으로 취약점을 식별하면 기존 취약점이 새로운 문제로 오인됩니다. - 그 결과 보안 팀은 이미 검토한 취약점을 다시 분류해야 하고, 스캔 결과에 대한 신뢰도도 낮아집니다. ## 기존 Scope+Offset 핑거프린팅 - 2022년에 도입된 방식으로, 취약점을 다음 두 요소의 조합으로 식별합니다. - 취약점을 포함하는 가장 좁은 코드 범위: 모듈, 클래스, 함수 등 - 해당 범위 내부에서 취약점까지의 줄 오프셋 - 파일 전체의 절대 줄 번호 대신 범위 내부 위치를 사용해 코드 이동에 더 강합니다. - 기존 줄 기반 추적보다 불필요한 재감사를 약 30% 줄였습니다. - 그러나 범위 시작점부터 취약점까지의 모든 줄을 계산했기 때문에 주석과 빈 줄 추가에는 취약했습니다. ## 비기능적 코드 무시를 통한 개선 - 개선된 알고리즘은 핑거프린트를 계산할 때 다음 요소를 제외합니다. - 주석 - 빈 줄 - 프로그램 동작에 영향을 주지 않는 코드가 취약점의 정체성에 영향을 주지 않아야 한다는 원칙을 적용했습니다. - 따라서 취약점 앞에 주석을 추가하거나 파일을 재포맷해도 동일한 핑거프린트가 유지됩니다. - 기존 방식의 추적 정밀도는 유지하면서 비기능적 수정에 대한 안정성만 높였습니다. - 스캐너가 이미 생성하는 파스 트리를 재사용하므로 스캔 시간은 증가하지 않습니다. ## 벤치마크 결과 - C/C++, C#, Go, Java, JavaScript, Python, Ruby의 소스 파일 439개를 대상으로 평가했습니다. - 취약점 바로 앞에 주석 또는 빈 줄 하나를 추가하는 커밋 2,247개를 생성했습니다. - 기존 Scope+Offset 방식: - 중복 핑거프린트 1,361개 발생 - 기준 대비 77% 증가 - 정규화된 방식: - 중복 핑거프린트 0개 - 고유 핑거프린트 43% 감소 - 모든 커밋이 취약점 인근의 비기능적 수정이라는 최악의 조건에서도 효과를 확인했습니다. ## GitLab 적용 방식 - 개선된 알고리즘 이름은 `scope_offset_compressed`입니다. - 다음 언어를 지원합니다. - C# - C/C++ - Go - Java - JavaScript - Python - Ruby - PHP - 기존 보안 보고서 형식은 변경되지 않았습니다. - 따라서 여러 SAST 도구를 함께 사용하는 환경에서도 기존 통합 구조와 호환됩니다. - 관련 연구는 “Vulnerability Tracking using Normalized Scope+Offset”라는 제목으로 ASE 2026 Industry Showcase에서 발표될 예정입니다. ## 실용적인 결론 SAST 도구는 줄 번호가 아니라 코드의 논리적 범위와 의미 있는 위치를 기준으로 취약점을 추적해야 합니다. 특히 주석, 빈 줄, 포맷 변경처럼 동작에 영향을 주지 않는 수정은 핑거프린트에서 제외하는 것이 중복 경고와 불필요한 재감사를 줄이는 효과적인 방법입니다.

원문 읽기(새 탭에서 열림)
gitlab3분 읽기큐레이션 요약

GitLab Duo Security Review, 스캐너가 놓치는 논리 결함 발견

정적 보안 스캐너는 SQL 인젝션이나 하드코딩된 비밀처럼 알려진 패턴에는 강하지만, 애플리케이션의 권한 모델과 업무 흐름을 이해해야 발견할 수 있는 논리적 취약점에는 한계가 있습니다. GitLab Duo Security Review의 Security Review Flow는 MR의 변경 내용을 주변 코드와 함께 분석해 권한 누락, 정보 노출, 비즈니스 로직 오류, 경쟁 조건 등을 찾아냅니다. 퍼블릭 베타 단계이며, 기존 스캐너와 수동 보안 검토를 보완하는 용도로 설계되었습니다. ## 패턴 기반 스캐너가 놓치는 취약점 - 코드 한 줄만 보면 정상적으로 보이지만, 애플리케이션의 도메인 규칙을 위반하는 문제가 주요 대상입니다. - **접근 제어 및 권한 문제** - 객체 ID만 바꿔 다른 사용자의 데이터를 조회하는 BOLA(Broken Object Level Authorization) - 관리자 전용 기능이나 상태 변경 작업에 대한 권한 검사 누락 - **데이터 노출** - 객체를 직렬화해 반환하는 코드는 문법상 문제가 없어도, 민감한 필드가 포함되면 정보 노출이 발생할 수 있습니다. - 어떤 필드가 민감한지, 어떤 사용자가 받아도 되는지는 도메인 지식이 필요합니다. - **제어 흐름과 업무 로직** - 결제 없이 주문 완료 단계에 접근 - 가격을 결정하는 파라미터를 조작 - 특정 상태에 반복 진입 - 동시 요청으로 상태 검증을 우회하는 경쟁 조건(race condition) ## MR마다 보안 판단을 적용하는 Security Review Flow - GitLab Duo Agent Platform의 기능으로, 코드 변경 시점에 보안 검토를 수행합니다. - 다음 유형의 문제를 탐지하도록 설계되었습니다. - 객체 수준 및 함수 수준 권한 우회 - 상태 변경 작업의 권한 검사 누락 - 정보 노출 및 대량 할당(mass assignment) - 비즈니스 로직 오류 - 상태 기반 워크플로의 경쟁 조건 - 수동 보안 리뷰나 침투 테스트를 대체하지 않고 보완합니다. - 수정 비용이 낮은 MR 단계에서 문제를 발견하는 것이 목적이며, GitLab 애플리케이션 보안팀도 내부 MR에 사용해 왔습니다. ## 변경 내용과 주변 맥락을 함께 분석 - MR의 diff뿐 아니라 다음 정보를 함께 검토합니다. - 원본 파일 - 변경된 코드 - MR 토론 내용 - 관련 코드 - 보안 엔지니어처럼 코드의 의도와 실행 흐름을 추론합니다. - 별도의 검증 단계가 각 발견 사항을 다시 점검해 오탐 가능성을 줄입니다. - 발견 결과는 관련 코드 라인의 diff 스레드와 내부 노트에 표시됩니다. - 퍼블릭 프로젝트에서는 보안 세부 정보가 외부에 노출되지 않도록 내부 노트에만 결과가 기록됩니다. ## 발견 사항과 MR 처리 방식 각 결과에는 다음 정보가 포함됩니다. - 취약점 유형과 CWE(Common Weakness Enumeration) 참조 - 심각도: Critical, High, Medium, Low - 분류 등급 - Tier 1: 악용 가능성이 높은 취약점 - Tier 2: 논리적 결함 - Tier 3: 설계 문제 - 문제에 대한 평이한 설명 - 가능한 경우 제공되는 수정 제안 심각도에 따라 MR 상태도 달라집니다. - Critical 또는 High: `Request changes` - Medium 또는 Low: `Comment` - 취약점이 발견되지 않아도 자동 승인하지 않으며, 최종 승인은 항상 사람이 담당합니다. 발견된 문제는 수정 제안 적용, 오탐으로 기각, 위험 수용 중 하나로 처리할 수 있습니다. 수정 후에는 새 검토를 요청해 변경 사항이 해결되었는지 다시 확인합니다. ## 도입 대상과 비용 - Security Review Flow는 GitLab Ultimate 고객을 위한 퍼블릭 베타 기능입니다. - GitLab.com, Self-Managed, Dedicated 환경에서 사용할 수 있습니다. - GitLab Duo Agent Platform 무료 체험 또는 Ultimate 구독에 포함된 GitLab Credits로 이용할 수 있습니다. - 비용은 diff의 복잡도와 선택한 모델에 따라 달라지므로, 전체 적용 전에 일부 MR에서 시험하는 것이 권장됩니다. - 베타 이후 가격은 변경될 수 있습니다. 실무에서는 기존 SAST·시크릿 스캐너를 계속 사용하면서, 인증·인가와 상태 전이가 복잡한 MR에 Security Review Flow를 추가하는 방식이 적절합니다. 특히 결제, 계정 권한, 개인정보, 멀티테넌트 데이터처럼 업무 규칙 위반의 영향이 큰 변경부터 적용하는 것이 효과적입니다.

원문 읽기(새 탭에서 열림)
dropbox3분 읽기큐레이션 요약

Dropbox가 MCP와 Dash를 활용해 디자인에서 코드로 이어지는 보안 격차를 해소하는 방법

Dropbox는 보안 위협 모델과 실제 코드 구현 사이의 단절을 MCP, 기초 언어 모델, Dash를 결합해 해결하고자 했다. 시스템은 코드 리뷰 시 관련 위협 모델을 자동으로 검색하고, 문서에 정의된 보안 요구사항이 코드에 반영됐는지 비교한다. 분석 결과 구현 PR의 12%만 원래 보안 검토와 연결되어 있었으며, 보안 지식을 코드 리뷰 시점에 자동으로 제공하는 것이 핵심 해결책으로 제시된다. ## 설계와 코드 사이의 보안 격차 - 보안 검토에서는 잠재적 위험, 공격 가능성, 필요한 보호 조치를 위협 모델에 기록한다. - 그러나 개발이 시작되면 위협 모델은 위키나 문서 시스템에 남고, 구현 코드는 별도의 PR에서 관리된다. - 명시적인 링크가 없으면 코드 리뷰어가 과거의 보안 요구사항을 확인하기 어렵다. - Dropbox의 분석 결과: - 구현 PR 중 원래 설계 검토 및 위협 모델을 연결한 비율은 **12%**에 불과했다. - 검증된 79개 쌍 중 **54%**는 보안 검토 후 한 달이 지나서야 PR이 생성됐다. - 보안 검토부터 PR 생성까지의 중앙값은 약 **5주**였다. - 일부 지연은 **11개월 이상**이었다. - 검토 후 2주 이내에 생성된 PR은 **29%**뿐이었다. ## 기존 보안 도구의 한계 - 정적 분석 도구는 코드에 특정 보안 제어가 존재하는지 확인할 수 있다. - 하지만 해당 제어가 설계 검토에서 합의한 요구사항과 일치하는지는 판단하기 어렵다. - 정적 분석은 코드의 패턴은 검사하지만, 설계 의도와 이전에 결정된 보안 맥락은 알지 못하기 때문이다. - 개발자에게 설계 문서와 PR을 직접 연결하도록 요구하거나 알림 봇을 사용하는 방식도 지속적인 준수에 의존한다. - 설계 검토의 약 **15%**는 코드가 먼저 작성된 뒤 사후적으로 진행됐다. - 따라서 자동화 시스템은 기존 검토와 코드를 연결하는 것뿐 아니라, 보안 검토가 필요할 가능성이 있는 작업을 개발 중 조기에 식별하는 역할도 할 수 있다. ## Dash와 MCP를 활용한 컨텍스트 연결 - Dash는 여러 연결된 애플리케이션의 문서를 색인하므로, 기존 위협 모델과 엔지니어링 문서를 통합적으로 검색할 수 있다. - Dropbox는 코드가 리뷰에 제출될 때 관련 위협 모델을 자동으로 검색하도록 시스템을 구축했다. - MCP(Model Context Protocol)는 AI 에이전트가 Dash가 색인한 문서에 접근하도록 하는 연결 계층이다. - 보안 검토 에이전트는 Dash의 MCP 서버를 통해 위협 모델과 관련 문서를 검색하고 읽는다. - 별도의 소스 시스템별 맞춤 통합 없이 여러 컨텍스트를 하나의 에이전트 세션에 결합할 수 있다. ## 요구사항과 구현 코드의 비교 - 코드 리뷰가 시작되면 에이전트는 관련 위협 모델과 보조 문서를 가져온다. - 기초 언어 모델은 문서에 기록된 보안 요구사항과 변경된 코드를 함께 분석한다. - 예를 들어 위협 모델이 특정 엔드포인트에 인증을 요구한다면, 실제 코드가 인증을 강제하는지 판단할 수 있다. - 기존 정적 분석과 달리 단순히 취약한 코드 패턴을 찾는 것이 아니라, **설계 단계의 보안 결정이 구현에 반영됐는지**를 검토한다. - 결과를 별도의 보안 절차가 아니라 개발자가 이미 사용하는 코드 리뷰 과정에 제공하는 것이 중요한 설계 원칙이다. ## 실용적인 결론 보안 검토 문서를 별도로 잘 작성하는 것만으로는 충분하지 않다. 해당 문서의 요구사항이 코드가 검토되는 시점에 자동으로 노출되고 구현과 비교되어야 하며, 이를 위해 조직의 기존 문서 검색 시스템과 MCP 기반 AI 에이전트를 코드 리뷰 흐름에 통합하는 접근이 효과적이다.

원문 읽기(새 탭에서 열림)
spotify4분 읽기큐레이션 요약

코딩은 더 이상 제약이 아니다: Spotify에서 팀과 에이전트를 위한 개발자 경험 확장 | Spotify Engineering

Spotify는 AI 코딩 에이전트 도입으로 개발 속도가 크게 향상되면서, 이제 코딩 자체보다 의사결정과 개발 경험의 확장성이 새로운 병목이 되었다고 설명합니다. 수년간 구축한 자동화 시스템, 내부 개발자 포털, 표준화된 기술 스택이 AI 에이전트의 성능과 신뢰성을 높이는 기반이 되었습니다. 그 결과 99% 이상의 엔지니어가 매주 AI 코딩 도구를 사용하고, 풀 리퀘스트 생성 빈도도 76% 증가했습니다. ## AI 코딩 도구의 폭발적인 확산 - Spotify 엔지니어의 99% 이상이 매주 AI 코딩 도구를 사용합니다. - 94%는 AI가 생산성을 높였다고 응답했습니다. - 풀 리퀘스트 생성 빈도는 76% 증가했습니다. - 대부분의 PR은 개발자와 AI 에이전트가 협업해 작성합니다. - 특히 Claude Opus 4.5 출시 이후 Claude Code 사용량이 급격히 증가했습니다. - Spotify는 과거에도 내부 생산성 도구를 꾸준히 배포했지만, AI 도구만큼 빠른 채택률은 경험하지 못했습니다. ## 에이전트 이전부터 시작된 자동화 - Spotify의 운영 코드베이스는 엔지니어 수보다 7배 빠르게 증가했습니다. - 개발자들은 기능 개발보다 다음과 같은 유지보수 작업에 더 많은 시간을 쓰게 되었습니다. - 의존성 업그레이드 - API 마이그레이션 - 보안 취약점 패치 - 특히 마이그레이션이 개발자 불만의 가장 큰 원인이었습니다. - 이를 해결하기 위해 여러 팀이 각자 수작업으로 처리하는 대신, 수백~수천 개 컴포넌트를 한꺼번에 변경하는 Fleet Management를 구축했습니다. - Fleetshift는 대상 식별, 작업 예약, 진행 상황 추적 등 전체 변경 작업을 조율합니다. - 지금까지 250만 건 이상의 자동화 유지보수 PR을 병합했으며, 대부분은 사람의 개입 없이 자동 병합되었습니다. ## Honk: 백그라운드 코딩 에이전트 - 단순한 변경에는 결정론적 스크립트가 효과적이었지만, API 교체나 대규모 리팩터링처럼 예외가 많은 작업에서는 한계가 있었습니다. - Spotify는 복잡한 스크립트를 계속 추가하는 대신 LLM이 코드 수정 작업을 수행하도록 했고, 그 결과 Honk를 만들었습니다. - Honk의 구성은 다음과 같습니다. - Claude와 Agent SDK 기반 - Spotify 자체 실행 하네스와 결합 - Kubernetes 파드에서 실행 - 여러 에이전트 세션을 클라우드에서 동시에 스케줄링 - 여러 운영체제에서 CI 빌드를 실행해 변경 사항 검증 - Fleetshift가 전체 작업을 관리하고 Honk가 실제 코드 수정을 담당합니다. - 최근 백엔드 서비스의 Java 마이그레이션은 한 명의 엔지니어가 3일 만에 완료했습니다. - 과거 수백 팀이 수주 또는 수개월에 걸쳐 수행하던 작업을 단일 엔지니어가 며칠 안에 처리할 수 있게 되었습니다. - Honk는 Slack에서도 호출할 수 있어, 대화 중 언급하면 맥락을 바탕으로 작업하고 PR을 생성합니다. - Honk v2에서는 다음 기능을 도입할 예정입니다. - 공유 에이전트 세션 - 팀 프로젝트 - Chirp를 통한 에이전트 오케스트레이션 - 여러 개발자와 에이전트의 협업 ## 에이전트에게도 필요한 개발자 경험 - Spotify는 “세계 최고 수준의 기술 영역을 적게 만들수록 더 빠르게 움직일 수 있다”는 원칙을 오래 유지해 왔습니다. - 제한된 기술 스택과 일관된 설계 패턴을 사용하면 다음 효과가 있습니다. - 팀 간 협업이 쉬워짐 - 기술 선택에 따른 불필요한 의사결정 감소 - 코드베이스에 대한 공통 전문성 향상 - 개발자와 에이전트가 참고할 수 있는 일관된 코드 증가 - Claude는 참고할 코드가 많고 그 구조가 일관될수록 더 나은 결과를 냅니다. - 반대로 코드베이스가 파편화되어 있으면 에이전트 성능도 측정 가능하게 저하됩니다. ## Backstage를 통한 통합과 표준화 - Spotify는 오픈소스 내부 개발자 포털인 Backstage를 개발 경험의 중심으로 사용합니다. - Backstage 이전에는 배포, CI, A/B 테스트 등 기능별로 약 100개의 내부 도구가 분리되어 있었습니다. - Backstage는 이를 하나의 화면으로 통합하고, 소프트웨어 컴포넌트 카탈로그를 중심으로 관리합니다. - 개발자와 에이전트 모두 Backstage에서 다음 정보를 확인할 수 있습니다. - 컴포넌트 소유 팀 - 관련 문서 - 기술 구성 - 담당자와의 커뮤니케이션 경로 - Spotify는 Backstage 기능을 MCP와 CLI 도구로 노출해 Claude도 동일한 정보를 활용하도록 했습니다. - 에이전트는 필요한 컴포넌트의 담당자를 조회하거나 문서를 읽고, Slack으로 책임 팀에 문의할 수 있습니다. ## Golden State와 자동 피드백 - Golden state는 컴포넌트 유형별 권장 기술과 개발 관행을 정의합니다. - Soundcheck는 각 팀이 자신의 컴포넌트가 표준을 얼마나 준수하는지 점검하는 UI를 제공합니다. - 정적 분석과 린팅을 결합하면 표준이 단순한 문서가 아니라 실제 가드레일로 작동합니다. - Claude가 권장되지 않는 기술이나 설계 패턴을 사용하면 린터가 즉시 피드백을 제공합니다. - 에이전트는 이 피드백을 바탕으로 스스로 코드를 수정할 수 있습니다. - 같은 피드백 루프가 개발자와 에이전트 모두에게 적용되므로, 조직 전체의 일관성을 유지하는 효과적인 수단이 됩니다. ## 실용적인 결론 AI 에이전트를 도입하려면 모델 자체보다 먼저 일관된 기술 스택, 중앙화된 컴포넌트 정보, 자동화된 검증 체계를 마련해야 합니다. 표준화된 코드베이스와 즉각적인 린트·CI 피드백이 갖춰질 때 에이전트는 대규모 마이그레이션과 유지보수 작업을 안정적으로 수행할 수 있습니다.

원문 읽기(새 탭에서 열림)
github4분 읽기큐레이션 요약

기준을 높이다: 품질, 공동의 책임, 그리고 GitHub 버그 바운티 프로그램의 미래

GitHub는 버그 바운티 프로그램을 유지하되, 제출량 증가와 검증되지 않은 보고서 확산에 대응해 심사 기준을 강화하겠다고 밝혔다. AI·스캐너 사용 자체는 환영하지만, 연구자가 실제 영향을 재현하고 검증할 책임이 있다는 점을 강조한다. 또한 사용자가 악성 콘텐츠를 직접 선택·실행하는 경우에는 GitHub의 보안 경계를 우회한 취약점이 아니라 공유 책임 영역으로 보는 원칙을 설명한다. ## 제출량 증가와 품질 문제 - AI와 새로운 보안 도구로 보안 연구 진입 장벽이 낮아지면서 업계 전반의 버그 바운티 제출량이 크게 증가했다. - 정당한 취약점이 늘어난 긍정적 효과도 있지만, 다음과 같은 저품질 보고서도 급증했다. - 실제 동작하는 개념 증명(PoC)이 없음 - 검증되지 않은 이론적 공격 시나리오 - GitHub가 이미 공개한 부적격 항목에 해당 - 보안 영향이 구체적으로 입증되지 않음 - GitHub는 프로그램을 중단하는 대신 제출 품질을 높이는 방향으로 대응한다. ## 강력한 취약점 보고서의 조건 - **작동하는 PoC와 실제 보안 영향** - 단순히 “이론적으로 가능하다”고 설명하는 데 그치지 않아야 한다. - 공격자가 실제로 무엇을 할 수 있는지 재현해야 한다. - 보안 경계를 넘을 수 있다는 사실과 구체적인 결과를 보여줘야 한다. - **범위와 부적격 항목 확인** - 제출 전에 GitHub의 버그 바운티 범위와 부적격 목록을 검토해야 한다. - DMARC/SPF/DKIM 설정 문제, 사용자 열거, 공격 경로가 입증되지 않은 보안 헤더 누락 등은 부적격 사례다. - 이런 보고서는 “해당 없음(Not Applicable)”으로 종료될 수 있으며 HackerOne Signal과 평판에 영향을 줄 수 있다. - **제출 전 직접 검증** - 스캐너, 정적 분석 도구, AI가 발견한 결과라도 사람이 재현하고 확인해야 한다. - 검증되지 않은 오탐은 트리아지 리소스를 낭비하는 잡음에 불과하다. ## AI 활용은 허용되지만 책임은 연구자에게 있음 - GitHub는 AI를 보안 연구에 사용하는 것을 금지하지 않는다. - AI는 공격 표면을 탐색하고 후보 취약점을 찾는 생산성 도구로 활용될 수 있다. - 다만 AI가 생성한 결과도 다음 조건을 충족해야 한다. - 실제 환경에서 검증 - 재현 가능성 확인 - 작동하는 PoC 제공 - 구체적인 보안 영향 설명 - AI뿐 아니라 스캐너와 정적 분석 도구의 결과에도 동일한 기준이 적용된다. - 도구가 아니라 결과물의 정확성과 품질이 평가 대상이며, 보고서의 정확성에 대한 최종 책임은 연구자에게 있다. ## 간결하고 구조화된 보고서 작성 강한 보고서는 다음 세 요소를 포함해야 한다. - **짧은 문제 요약** - **명확한 재현 절차와 증거** - 스크린샷 - HTTP 요청 - 터미널 출력 등 - **영향 설명** - 공격자가 실제로 달성할 수 있는 결과를 구체적으로 기술 반대로 긴 이론적 서술, 이미 알려진 배경의 반복, AI가 생성한 불필요한 문장은 핵심 취약점을 묻히게 해 처리 속도를 늦춘다. ## GitHub의 공유 책임 보안 모델 GitHub는 악성 콘텐츠를 탐지하고 처리하기 위해 자동 스캐닝과 수동 검토 등 다양한 방어 체계를 운영한다. 그러나 모든 콘텐츠를 사전에 신뢰할 수 있는 것은 아니므로, 사용자와 GitHub가 보안을 함께 책임지는 공유 책임 모델을 적용한다. 사용자에게 기대되는 책임은 다음과 같다. - 신뢰할 저장소, 이슈, 코드를 신중하게 선택 - 코드·스크립트·워크플로 등 실행 가능한 콘텐츠를 실행하기 전 검토 - 저장소를 클론하는 행위가 해당 코드에 대한 신뢰를 선택하는 것임을 이해 - 토큰, 자격 증명, 로컬 보안 설정을 안전하게 관리 사용자가 악성 저장소를 직접 클론하거나, 악성 파일을 열거나, 신뢰하지 않는 코드를 AI 도구에 분석하도록 제공해야만 문제가 발생한다면, 이는 대체로 GitHub의 보안 통제를 우회한 사례로 간주되지 않는다. ## 공유 책임 영역의 대표 사례 - 사용자가 직접 AI 도구에 제공한 콘텐츠를 이용한 프롬프트 인젝션 - 사용자가 체크아웃한 저장소에서 Git 훅이나 필터가 코드 실행 - 사용자가 클론한 저장소에 포함된 악성 콘텐츠 - 사용자가 제공한 신뢰할 수 없는 입력을 처리하는 LLM의 예기치 않은 출력 이러한 연구도 가치가 있지만, 실제 보안 통제를 우회해 사용자가 악성 콘텐츠를 적극적으로 신뢰하지 않아도 피해가 발생하는지 입증해야 의미 있는 취약점 보고서가 된다. 실무적으로는 AI나 자동화 도구를 적극 활용하되, 제출 전 반드시 수동 재현과 영향 검증을 수행하는 것이 좋다. 보고서는 “요약-재현 절차-실제 영향” 중심으로 간결하게 작성하고, GitHub의 범위·부적격 목록과 사용자 신뢰가 전제된 보안 모델을 먼저 확인해야 한다.

원문 읽기(새 탭에서 열림)
netflix5분 읽기큐레이션 요약

Nebula ArchRules로 ArchUnit 확장하기

Netflix는 수만 개의 Java 저장소에서 공통 아키텍처 규칙과 기술 부채를 일관되게 점검하기 위해 ArchUnit을 여러 저장소에 배포·적용하는 Nebula ArchRules를 구축했다. ArchUnit은 AST가 아닌 JVM 바이트코드를 분석하므로 Java뿐 아니라 Kotlin·Scala에도 적용할 수 있고, 타입 안전한 Java API로 규칙을 작성·테스트할 수 있다. Nebula 플러그인은 이를 공유 가능한 Gradle 규칙 라이브러리로 확장해 조직 전체의 라이브러리 사용 규칙과 API 생명주기를 자동 검증한다. ## Netflix의 문제: 라이브러리 생명주기와 기술 부채 - Netflix는 수만 개의 Java polyrepo를 운영하므로 공통 빌드 로직과 품질 규칙을 여러 저장소에 배포해야 한다. - 하위 호환성을 깨는 라이브러리 변경 사고를 계기로, deprecated API를 언제 안전하게 제거할 수 있는지 파악할 필요가 생겼다. - API에는 다음과 같은 생명주기 애너테이션을 사용한다. - `@Deprecated`: 더 이상 사용하지 않도록 지정된 API - `@Public`: 하위 프로젝트가 사용하도록 공개된 API - `@Experimental`: 아직 안정성이 보장되지 않는 신규 API - 그 외 API: 기본적으로 내부 구현으로 간주 - 문제는 라이브러리 작성자가 어떤 downstream 프로젝트가 내부 API나 deprecated API를 잘못 사용하고 있는지 알기 어렵다는 점이다. - Spring Boot 주요 버전 업그레이드 같은 fleet-wide migration에서도 deprecated API 사용 현황을 파악하는 것이 중요하다. ## ArchUnit을 선택한 이유 - ArchUnit은 JUnit 테스트 안에서 아키텍처 규칙을 검증하는 오픈소스 라이브러리다. - ASM 기반으로 JVM 바이트코드를 분석하므로 특정 소스 언어의 문법에 덜 의존한다. - Java, Kotlin, Scala처럼 서로 다른 JVM 언어로 작성된 코드에도 같은 규칙을 적용할 수 있다. - 소스 코드의 syntactic sugar에 가려진 실제 실행 바이트코드까지 검사할 수 있다. - 규칙 작성 방식은 두 가지다. - 대부분의 규칙은 fluent builder API로 간결하게 작성한다. - 복잡한 분석에는 더 낮은 수준의 API와 클래스 관계 정보에 접근할 수 있다. - 분석 대상 전체 classpath를 읽고 클래스 간 의존성, 호출 관계, 소유자 등을 그래프로 유지한다. - 단순한 파일 단위 검사를 넘어 호출 사이트와 클래스 관계를 기준으로 규칙을 작성할 수 있다. ## AST 기반 도구와의 차이 - PMD 같은 AST 기반 도구는 소스 문법 구조를 직접 검사한다. - 언어별 문법 차이 때문에 Kotlin이나 Scala 지원 시 규칙을 별도로 작성해야 할 수 있다. - 예상하지 못한 문법적 표현으로 규칙을 우회할 가능성도 있다. - ArchUnit 규칙은 컴파일 결과인 바이트코드를 대상으로 하므로 코드가 어떤 JVM 언어로 작성됐는지보다 실제 동작 구조가 중요해진다. - PMD의 XPath 문자열 규칙과 달리 ArchUnit은 타입 안전한 Java 코드와 fluent API를 사용한다. - IDE 자동완성의 도움을 받을 수 있다. - 별도의 분석 프로세스를 구성하지 않고 규칙 객체와 클래스 목록을 직접 전달해 단위 테스트할 수 있다. ## 규칙 작성의 편의성 - ArchUnit에서는 다음과 같은 형태로 규칙을 표현할 수 있다. - 특정 클래스가 특정 타입에 의존하지 않아야 함 - 특정 생성자를 호출할 때 필수 인자를 전달해야 함 - 특정 패키지 간 의존성을 금지함 - 예를 들어 `DateTime` 객체를 시간대 정보 없이 생성하지 못하게 하는 규칙을 fluent API로 작성할 수 있다. - 규칙은 일반적인 Java 코드이므로 다음 작업이 쉽다. - 리팩터링 - IDE 기반 탐색 - 컴파일 시 오류 검출 - 단위 테스트 - 클래스 관계 그래프를 활용하면 단순한 이름 매칭보다 풍부한 맥락을 가진 규칙을 만들 수 있다. ## 공유 가능한 ArchRules 라이브러리 - 기본 ArchUnit은 하나의 저장소에서 JUnit 테스트로 사용하는 구조다. - Nebula ArchRules는 규칙을 별도 라이브러리로 패키징해 여러 Gradle 저장소에서 재사용할 수 있도록 한다. - `ArchRules Library Plugin`은 Gradle 프로젝트에 `archRules`라는 별도 source set을 추가한다. - 이 source set에는 `ArchRulesService`를 구현하는 클래스를 작성한다. - `ArchRulesService`는 `Map<String, ArchRule>`을 반환하는 단일 추상 메서드를 가진다. - map의 key는 규칙 이름이고 value는 실제 ArchUnit 규칙이다. - 규칙 코드는 본 애플리케이션 코드와 분리되어 별도의 JAR로 패키징된다. - 산출물에는 `arch-rules` classifier가 붙는다. - Gradle Module Metadata를 통해 `arch-rules` usage variant로 배포된다. - 따라서 downstream 프로젝트가 규칙을 사용하려면 Gradle Module Metadata 기반 의존성 해결이 필요하다. ## 독립형 규칙 라이브러리 - Standalone rule library는 본체 애플리케이션 코드 없이 `archRules`만 포함한다. - 다음과 같은 외부 코드 검사에 적합하다. - Java 표준 API 사용 규칙 - Guava 같은 오픈소스 라이브러리 사용 규칙 - 조직 공통 규칙 - `@Deprecated` API 사용 금지 - Netflix는 누구나 사용할 수 있는 OSS standalone 규칙 라이브러리 모음을 유지하며, 직접 규칙을 작성할 때 참고할 수 있는 예제로도 활용한다. ## 번들형 규칙 라이브러리 - Bundled rule library는 일반 라이브러리 코드와 해당 라이브러리 사용 규칙을 함께 배포한다. - `main` source set에는 라이브러리의 실제 기능을 담고, `archRules` source set에는 해당 라이브러리를 사용할 때 지켜야 할 규칙을 담는다. - 예를 들어 특정 라이브러리가 제공하는 공개 API의 올바른 사용법이나, 내부 API·deprecated API에 대한 접근 제한을 규칙으로 포함할 수 있다. - 라이브러리와 사용 규칙을 함께 배포하면 라이브러리 작성자가 권장 사용 방식을 downstream 빌드 과정에서 직접 검증할 수 있다. ## 실용적인 결론 ArchUnit은 단순한 단일 저장소용 아키텍처 테스트를 넘어, 바이트코드와 클래스 관계를 활용하는 범용 JVM 정적 분석 도구로 활용할 수 있다. 조직 차원에서는 Nebula ArchRules처럼 규칙을 별도 Gradle 라이브러리로 배포해 deprecated API 사용, 내부 API 접근, 라이브러리별 권장 패턴을 모든 저장소의 빌드 과정에서 자동 검증하는 방식이 효과적이다.

원문 읽기(새 탭에서 열림)
github3분 읽기큐레이션 요약

당신의 코드는 얼마나 노출되어 있나요? 단 몇 분 만에 무료로 확인해 보세요

대부분의 코드베이스에는 아직 발견되지 않은 보안 취약점이 존재하며, 수동 검토나 제한적인 도구만으로는 이를 파악하기 어렵다. GitHub는 조직의 활성 저장소를 몇 분 안에 점검하는 무료 **Code Security Risk Assessment**를 공개했다. 이 assessment는 CodeQL로 취약점을 찾고, 위험도와 언어·저장소별 분포, Copilot Autofix 적용 가능성까지 보여줘 보안 대응 우선순위를 정하도록 돕는다. ## Code Security Risk Assessment의 기능 - GitHub의 정적 분석 엔진인 **CodeQL**을 사용해 조직에서 가장 활발한 저장소 최대 20개를 검사한다. - 별도 라이선스 구매나 설정 없이 원클릭으로 실행할 수 있다. - 다음 정보를 대시보드로 제공한다. - 전체 취약점 수와 심각도별 분류: Critical, High, Medium, Low - 프로그래밍 언어별 취약점 분포 - 발견된 보안 규칙과 해당 규칙의 영향 저장소 수 - 취약점이 가장 많은 저장소 - Copilot Autofix로 자동 수정할 수 있는 취약점 수 - GitHub Enterprise Cloud 및 GitHub Team 플랜의 조직 관리자와 보안 관리자가 사용할 수 있다. - 스캔에 사용된 GitHub Actions 실행 시간은 사용량 할당량에서 차감되지 않는다. ## 시크릿과 코드 취약점을 함께 파악 - 기존의 **Secret Risk Assessment**는 저장소에 노출된 인증 정보와 자격 증명을 파악하는 기능이다. - Code Security Risk Assessment는 소스 코드 자체의 취약점을 분석한다. - 두 assessment는 하나의 진입점과 탭 기반 화면에서 함께 실행할 수 있다. - 이를 통해 조직은 다음 두 가지 위험을 통합적으로 확인할 수 있다. - 유출된 시크릿 및 자격 증명 - 애플리케이션 코드의 보안 취약점 - GitHub는 2025년에 Secret Protection 사용 고객들이 약 20억 건의 push를 검사하고, 약 1,900만 건의 시크릿 노출을 차단했다고 설명한다. ## 취약점 발견에서 수정까지 - 취약점을 찾는 것만으로는 충분하지 않으며, 실제 수정 속도가 위험 감소에 중요하다. - GitHub Code Security와 Copilot Autofix는 개발자가 작업하는 pull request 안에서 취약점을 수정하도록 지원한다. - GitHub가 제시한 2025년 수치는 다음과 같다. - Copilot Autofix로 수정된 보안 경고: **460,258건** - pull request에서 직접 해결된 취약점 경고: **50%** - 평균 해결 시간: - Copilot Autofix 사용: **0.66시간** - 수동 수정: **1.29시간** - assessment 결과에서 Copilot Autofix를 적용할 수 있는 취약점 수를 확인하고, 결과 화면에서 GitHub Code Security를 바로 활성화할 수 있다. ## 어떤 조직에 유용한가 - 보안 스캔을 아직 도입하지 않은 조직이 현재 위험 수준을 빠르게 파악할 수 있다. - 기존 보안 도구를 사용하는 조직도 다른 관점에서 코드베이스 전체를 점검할 수 있다. - 여러 팀과 언어로 구성된 조직에서 취약점이 집중된 저장소와 기술 영역을 식별하는 데 유용하다. - 평가 결과를 바탕으로 어떤 제품이나 보안 기능을 도입할지 판단할 수 있다. - Secret Protection: 자격 증명 유출 방지 - Code Security: 코드 취약점 탐지 및 수정 우선 무료 assessment를 실행해 조직의 취약점 분포와 우선순위를 확인하는 것이 좋다. 이후 반복적인 스캔과 pull request 기반 수정 프로세스를 도입하면 일회성 점검을 지속적인 보안 관리로 발전시킬 수 있다.

원문 읽기(새 탭에서 열림)
github3분 읽기큐레이션 요약

깃허브, AI 기반 탐지 기능으로 애플리케이션 보안 범위 확장

GitHub는 AI 기반 보안 탐지를 도입해 CodeQL만으로는 충분히 다루기 어려운 언어와 프레임워크까지 애플리케이션 보안 범위를 확장한다. 이 기능은 풀 리퀘스트에서 취약점을 탐지하고 Copilot Autofix로 수정안까지 제안해, 코드 병합 전에 위험을 발견·해결하는 것을 목표로 한다. 공개 프리뷰는 2026년 2분기 초에 제공될 예정이다. ## CodeQL과 AI 탐지를 결합한 보안 검사 - CodeQL은 지원 언어에 대해 깊은 의미 분석을 제공하는 기존 정적 분석 엔진이다. - 현대 저장소에는 Shell/Bash 스크립트, Dockerfile, Terraform(HCL), PHP 등 다양한 생태계의 코드가 함께 포함된다. - GitHub는 CodeQL과 AI 기반 탐지를 결합한 하이브리드 모델로 이러한 영역까지 보안 검사 범위를 넓힌다. - AI 탐지는 전통적인 정적 분석으로 지원하기 어려운 코드에서 잠재적 취약점과 수정 제안을 찾아낸다. - 내부 테스트에서 30일 동안 17만 건 이상의 결과를 처리했으며, 개발자 긍정 피드백 비율은 80%를 넘었다. - 이 기능은 보안·코드 품질·코드 리뷰를 지원하는 GitHub의 에이전트형 탐지 플랫폼을 기반으로 한다. ## 풀 리퀘스트에서 취약점 조기 발견 - 풀 리퀘스트가 생성되면 GitHub Code Security가 변경 사항에 적합한 방식을 자동으로 선택해 분석한다. - 지원 언어에는 CodeQL 정적 분석을 사용한다. - 추가 생태계에는 AI 기반 보안 탐지를 적용한다. - 결과는 기존 코드 스캐닝 결과와 함께 풀 리퀘스트 안에 표시된다. - 탐지 대상에는 다음과 같은 문제가 포함된다. - 안전하지 않은 문자열 결합 방식의 SQL 쿼리나 명령어 - 취약한 암호화 알고리즘 - 민감한 리소스를 노출하는 인프라 구성 - 개발자는 별도 보안 도구로 이동하지 않고 코드 리뷰 과정에서 위험을 확인할 수 있다. ## Copilot Autofix를 통한 수정 자동화 - 취약점을 찾는 것뿐 아니라 빠르고 안전하게 수정하는 것도 보안 운영의 핵심이다. - Copilot Autofix는 탐지 결과를 바탕으로 개발자가 검토·테스트·적용할 수 있는 수정안을 제안한다. - 2025년 Autofix는 46만 건 이상의 보안 경고 해결에 사용됐다. - Autofix를 사용한 경우 평균 해결 시간은 0.66시간으로, 사용하지 않은 경우의 1.29시간보다 짧았다. - 탐지와 자동 수정 제안을 연결해 취약점 발견부터 해결까지의 시간을 줄인다. ## 병합 시점의 보안 정책 적용 - GitHub는 코드가 검토되고 승인되는 병합 지점에서 보안 결과를 통제할 수 있도록 한다. - 보안 탐지, 수정 제안, 정책 집행을 풀 리퀘스트에 통합하면 배포 이후가 아니라 병합 전에 위험을 차단할 수 있다. - 팀은 개발자가 기존 워크플로를 벗어나지 않으면서 보안 기준을 적용할 수 있다. - 장기적으로는 정적 분석의 정확성과 AI의 맥락 이해를 결합한 더 발전된 탐지 체계로 확장될 예정이다. 실무에서는 CodeQL이 지원하는 핵심 언어뿐 아니라 Shell, Docker, Terraform, PHP 등을 사용하는 저장소에도 해당 기능을 검토할 만하다. 다만 AI가 제안한 수정안은 반드시 개발자가 코드 의도와 테스트 결과를 확인한 뒤 병합하는 것이 좋다.

원문 읽기(새 탭에서 열림)
toss원문

AST로 Outdated 없는 퍼널 문서 만들기 (새 탭에서 열림)

토스팀은 복잡한 판매자 입점 퍼널을 효율적으로 관리하기 위해 코드를 정적으로 분석하여 자동으로 업데이트되는 퍼널 문서를 구축했습니다. 기존의 수동 문서는 빈번한 코드 변경을 따라가지 못해 실효성을 잃었으나, `ts-morph`와 AST(Abstract Syntax Tree) 분석을 통해 코드와 100% 일치하는 흐름도를 생성할 수 있게 되었습니다. 이를 통해 개발자는 복잡한 조건부 분기와 페이지 이동 로직을 별도의 문서 작업 없이도 시각적으로 정확하게 파악할 수 있게 되었습니다. **수동 문서화의 한계와 정적 분석의 선택** * **문서의 파편화:** 수기로 작성된 다이어그램은 코드가 수정될 때마다 즉시 업데이트되지 않아 실제 동작과 문서가 불일치하는 'Outdated' 문제가 발생합니다. * **복잡한 분기 처리의 어려움:** 수십 개의 페이지와 80여 개의 조건부 분기를 시각적 도구로 일일이 표현하는 것은 휴먼 에러의 위험이 크고 관리가 불가능합니다. * **정적 분석 채택:** 런타임 분석은 모든 경로를 직접 실행해야 하는 번거로움이 있지만, AST를 활용한 정적 분석은 코드를 텍스트로 읽어 모든 잠재적 경로를 빠르고 안전하게 추출할 수 있습니다. **Navigation Edge 데이터 구조 설계** * **맥락 정보 포함:** 단순한 이동 경로(A → B)를 넘어, 이동 방식(`push` vs `replace`), 실행 조건, 쿼리 파라미터 등의 상세 데이터를 포함하는 `NavigationEdge` 인터페이스를 설계했습니다. * **추적 가능성 확보:** 코드 내 정확한 위치(`lineNumber`)와 호출 출처(`sourceType`)를 저장하여 다이어그램에서 실제 소스 코드로 즉시 연결될 수 있는 기반을 마련했습니다. **AST를 활용한 로직 추출 및 조건문 파싱** * **패턴 감지:** `ts-morph`를 사용하여 프로젝트 내 페이지 파일을 탐색하고, `router.push()` 또는 `router.replace()`와 같은 함수 호출 패턴을 감지합니다. * **상위 노드 추적:** 특정 이동 로직이 발견되면 AST의 부모 방향으로 거슬러 올라가 가장 가까운 `if`문이나 삼항 연산자의 텍스트를 추출함으로써 이동 조건(Condition)을 파악합니다. **커스텀 훅 및 URL 상수의 역추적** * **숨은 로직 탐색:** 페이지 컴포넌트 내부뿐만 아니라, `import` 구문을 분석하여 커스텀 훅 내부에 숨겨진 이동 로직까지 추적하여 데이터 누락을 방지합니다. * **상수 해독:** `URLS.FUNNEL.PAY_METHOD`와 같이 상수로 정의된 목적지를 실제 URL 경로로 변환하기 위해 상수 정의 파일을 별도로 파싱하여 매핑 테이블을 구축했습니다. **실용적인 결론** 복잡도가 높은 서비스일수록 문서와 코드의 동기화는 자동화되어야 합니다. `ts-morph`와 같은 도구를 활용해 소스 코드를 단일 진실 공급원(Single Source of Truth)으로 삼는 자동화 문서를 구축하면, 불필요한 커뮤니케이션 비용을 줄이고 퍼널 전체의 비즈니스 로직을 명확하게 시각화할 수 있습니다.

datadog원문

LLM을 활용한 대규모 악성 풀 리퀘스트 탐지 (새 탭에서 열림)

Datadog은 AI 코딩 어시스턴트의 도입으로 급증한 코드 작업량과 이로 인한 보안 취약점 문제를 해결하기 위해, LLM 기반의 실시간 코드 리뷰 시스템인 'BewAIre'를 구축했습니다. 이 시스템은 기존의 정적 분석 도구가 탐지하기 어려운 공격자의 의도와 교묘한 난독화 패턴을 추론하여, 매주 수만 건에 달하는 풀 리퀘스트(PR)를 실시간으로 검사합니다. 이를 통해 보안 팀의 리뷰 피로도를 대폭 줄이면서도 높은 정확도로 악성 코드 삽입을 차단하는 성과를 거두고 있습니다. **AI 시대의 코드 보안 위협과 한계** * **급증하는 코드량과 공격 표면:** AI 어시스턴트 활용으로 매주 약 10,000개의 PR이 생성되면서 보안 팀이 검토해야 할 범위가 기하급수적으로 늘어났습니다. * **정적 분석의 한계:** 기존 SAST 도구는 정해진 규칙 기반으로 작동하여, 정상적인 의존성 업데이트나 권한 변경으로 위장한 지능형 공격(예: tj-actions 해킹)의 '의도'를 파악하지 못합니다. * **교묘한 난독화 기법:** 공격자들은 Base64 인코딩을 사용해 악성 스크립트를 숨기거나, 신뢰할 수 있는 봇 계정을 도용하여 보안 검사를 우회하는 전략을 사용합니다. **LLM 기반 보안 시스템 'BewAIre'의 구조** * **데이터 전처리 및 컨텍스트 강화:** 모든 PR의 코드 차이점(Diff)을 추출하고 작성자 정보, 저장소 유형 등의 메타데이터를 결합하여 모델이 분석할 수 있는 형태로 정규화합니다. * **의도 중심의 추론(Inference):** LLM은 단순한 문법 검사를 넘어 수정 사항 뒤에 숨겨진 의도를 분석하며, 특정 변경이 악의적인지 아니면 정상적인 패턴인지 분류합니다. * **실시간 경보 체계:** 분석 결과는 Datadog 보안 신호로 변환되어 대시보드에 즉시 반영되며, 위험도가 높은 경우 보안 엔지니어에게 즉각적인 알림(Paging)을 전송합니다. **실전 검증을 통한 성능 및 성과** * **높은 탐지 정확도:** 수백 개의 PR 데이터셋을 테스트한 결과 99.3% 이상의 정확도를 기록했으며, 실제 발생했던 tj-actions 및 Nx 공격 사례를 100% 탐지해냈습니다. * **낮은 오탐률(False Positive):** 프롬프트 엔지니어링과 데이터 튜닝, 안전한 패턴에 대한 억제 규칙을 적용하여 오탐률을 0.03% 수준으로 유지하며 개발 속도 저하를 방지했습니다. * **맥락 제한 극복:** 모델의 컨텍스트 제한으로 인한 성능 저하를 방지하기 위해 데이터를 효율적으로 정제하고 프롬프트를 최적화하는 기술적 노하우를 적용했습니다. 대규모 개발 환경에서 보안을 유지하려면 인간 리뷰어의 피로도를 줄여줄 수 있는 지능형 자동화 도구가 필수적입니다. LLM을 보안 리뷰에 도입할 때는 단순한 코드 분석을 넘어 작성자의 의도와 주변 맥락을 함께 파악하도록 설계해야 하며, 이를 기존의 보안 모니터링 워크플로우에 통합함으로써 실질적인 방어 체계를 구축할 수 있습니다.

datadog원문

정적 분석기를 Java에서 Rust로 마이그레이션한 방법 (새 탭에서 열림)

Datadog은 정적 분석 도구의 성능 병목 현상을 해결하고 제한된 CI 환경에서의 효율성을 극대화하기 위해 기존 Java 기반의 엔진을 Rust로 완전히 재작성했습니다. 이 과정에서 ANTLR 대신 Tree-sitter를 도입하고 JavaScript 규칙 실행 엔진을 GraalVM에서 Deno(V8)로 교체함으로써, 분석 속도는 3배 향상시키고 메모리 사용량은 10배 절감하는 성과를 거두었습니다. 결과적으로 이번 전환은 고성능 정적 분석을 위해 언어와 런타임 수준의 근본적인 변화가 필수적이었음을 보여줍니다. **Java 기반 정적 분석기의 한계와 환경적 제약** * **CI 자원 최적화 문제:** 고객의 CI 환경(예: GitHub Actions)에서 분석기를 실행할 때, 2코어 및 7GB RAM과 같은 제한된 자원 내에서 Java 분석기는 수천 개의 파일을 스캔하는 데 5분 이상 소요되어 목표치(3분 이내)를 충족하지 못했습니다. * **환경 충돌 및 오버헤드:** Java 기반 분석기는 최신 JVM(17+)을 요구하는데, 이는 고객의 기존 CI 환경에 설치된 Java 버전과 충돌을 일으키거나 불필요한 설정 부담을 주었습니다. * **파싱 성능 저하:** 기존에 사용하던 ANTLR은 대규모 저장소에서 파싱 속도가 느렸고, 특정 언어에 대한 지원이 부분적이라는 기술적 한계가 있었습니다. **Tree-sitter 도입과 Rust로의 전환 결정** * **파서 교체:** 성능 향상을 위해 C로 구현되어 속도가 빠르고 오픈소스 커뮤니티가 활발한 Tree-sitter를 채택했습니다. * **Java 라이브러리의 한계:** Tree-sitter용 Java 라이브러리는 분석기 최적화에 필수적인 패턴 매칭 기능을 지원하지 않는 등 기능이 제한적이었습니다. * **언어 선택의 기로:** Tree-sitter가 가장 견고하게 지원하는 언어가 Rust라는 점에 착안하여, 예측 가능한 성능을 위해 Rust로의 전체 재작성이라는 도전적인 경로를 선택했습니다. **Rust 기반의 새로운 아키텍처 구성** * **AST 구축(Tree-sitter):** Rust는 Tree-sitter 생태계의 "일등 시민(First-class citizen)"으로, 직접적인 라이브러리 연동을 통해 별도의 Java 바인딩 유지보수 없이도 강력한 파싱 기능을 확보했습니다. * **자바스크립트 규칙 실행(Deno):** 정적 분석 규칙은 자바스크립트로 작성되는데, 기존 Java의 GraalVM 대신 Deno(deno-core)를 런타임으로 도입했습니다. * **보안 및 효율성:** Deno의 V8 엔진을 활용하되, 분석 규칙이 디스크나 네트워크에 접근하지 못하도록 `deno-core` 크레이트만 통합하여 보안이 강화된 샌드박스 환경을 구축했습니다. **마이그레이션 결과 및 기술적 권고** 성공적인 Rust 전환을 통해 동일한 프로그램에 대해 Java 버전과 일치하는 분석 결과를 보장하면서도 성능은 3배, 메모리 효율은 10배 개선되었습니다. 특히 리소스가 제한된 CI/CD 파이프라인에서 정적 분석 도구를 운영해야 한다면, JVM과 같은 무거운 런타임보다는 Rust와 같이 저수준 제어가 가능하고 메모리 오버헤드가 적은 언어를 선택하는 것이 장기적으로 유리합니다.

figma원문

C++ 빌드 시간 단축하기 (새 탭에서 열림)

피그마(Figma)는 C++ 코드베이스가 10% 증가할 때 빌드 시간이 50%나 급증하는 문제를 해결하기 위해, 컴파일러로 전송되는 데이터 양(바이트)을 줄이는 전략을 채택했습니다. 하드웨어 업그레이드나 캐싱만으로는 한계가 있음을 깨닫고, 불필요한 헤더 포함을 자동으로 찾아내고 방지하는 자체 도구인 'DIWYDU'와 'includes.py'를 개발하여 빌드 시간을 절반으로 단축했습니다. 결과적으로 빌드 시간의 핵심 지표가 전처리 후의 바이트 수에 비례한다는 점을 입증하며 대규모 개발 환경에서의 생산성을 확보했습니다. ### 헤더 포함 방식과 빌드 속도의 상관관계 * C++ 컴파일 과정에서 전처리기(Pre-processor)는 소스 파일에 포함된 모든 헤더 파일을 하나의 거대한 파일로 합치며, 이는 전이적 의존성(Transitive dependency)을 포함해 컴파일러가 처리해야 할 바이트 수를 기하급수적으로 늘립니다. * 피그마의 분석 결과, 실제 추가된 코드량보다 전처리 후 컴파일러로 전달되는 바이트 수의 증가 폭이 훨씬 컸으며, 이것이 빌드 시간 지연의 주요 원인으로 파악되었습니다. * 대형 파일에서 불필요한 헤더를 수동으로 제거하는 실험을 진행한 결과, 컴파일 바이트는 31%, 콜드 빌드 시간은 25% 감소하며 가설이 증명되었습니다. ### DIWYDU: 불필요한 헤더 제거 자동화 * 구글의 IWYU(Include What You Use)가 너무 엄격하여 적용이 어렵자, 피그마는 더 유연한 자체 도구인 DIWYDU(Don’t Include What You Don’t Use)를 개발했습니다. * 이 도구는 `libclang`의 파이썬 바인딩을 사용하여 추상 구문 트리(AST)를 분석하며, 특정 파일이 포함한 헤더에서 함수, 타입, 변수 등을 직접적으로 사용하는지 확인합니다. * 직접적인 의존성이 없는 헤더를 찾아내어 삭제하도록 플래그를 표시함으로써 모든 기능 브랜치에서 빌드 속도 저하를 방지합니다. * 다만, STL(표준 템플릿 라이브러리)의 프라이빗 헤더 구조나 `libclang` 파이썬 바인딩의 AST 노드 접근 제한(UNEXPOSED_EXPR 등)과 같은 기술적 한계는 존재합니다. ### includes.py를 통한 회귀 방지 및 측정 * 헤더를 실제로 사용하더라도 파일 크기가 너무 커서 빌드 속도를 늦추는 경우를 대비해, 전이적 바이트 수를 측정하는 `includes.py`를 구축했습니다. * Clang을 사용하지 않고 순수 파이썬으로 작성되어 실행 속도가 매우 빠르며(수 초 내외), CI(지속적 통합) 시스템에서 각 PR이 빌드 시간에 미치는 영향을 바이트 단위로 측정합니다. * 특정 PR이 컴파일 바이트 수를 과도하게 늘릴 경우 경고를 발생시켜 개발자가 전방 선언(Forward Declaration)을 사용하거나 헤더를 분리하도록 유도합니다. * 표준 라이브러리는 피그마 내부의 래퍼(Wrapper) 디렉토리를 통해 관리되므로, 표준 헤더의 바이트는 계산에서 제외하여 효율성을 높였습니다. C++ 프로젝트의 빌드 속도를 유지하기 위해서는 단순한 캐싱을 넘어 컴파일러가 처리하는 데이터의 총량을 관리해야 합니다. 불필요한 헤더 의존성을 제거하는 자동화 도구를 CI 파이프라인에 통합하고, '컴파일 바이트 수'를 성능 지표로 모니터링하는 것이 대규모 코드베이스의 개발 효율을 높이는 실질적인 방안이 될 수 있습니다.