보안 도구를 만들었습니다. 그런데 그 도구가 스스로의 치명적인 결함을 찾아냈습니다.

저는 코드 보안 분석기를 만들고 있습니다. 이름은 vibeanalyzer라고 지었습니다.

목표는 간단합니다. 요즘 많은 사람들이 "vibe-code"를 합니다. AI 에이전트에게 코드를 작성하게 맡기는 것이죠. 코드는 깔끔해 보이고 테스트도 통과합니다. 하지만 개발자는 프로젝트 내부에 실제로 무엇이 들어있는지 전혀 알지 못합니다.

본격적으로 시작하기 전에, 진작 했어야 할 일을 했습니다. 기존 도구들이 이미 이 문제를 해결했는지 확인해 본 것입니다. 이미 해결되어 있었습니다. Semgrep, CodeQL, Snyk 같은 도구들은 저보다 훨씬 뛰어납니다.

제 프로젝트에 Semgrep을 돌려보았습니다. 결과는 냉혹한 현실을 일깨워 주었습니다.

Semgrep은 제 의존성(dependencies)에서 6개의 문제를 발견했습니다:

• 해시 선택과 관련된 사소한 문제 하나. • esbuild와 vite에서의 High 등급 보안 문제 두 개. • 경로 탐색(path traversal)과 관련된 Medium 등급 보안 문제 세 개. • vitest에서의 Critical 등급 보안 문제 하나.

vitest의 문제는 경로 탐색 취약점이었습니다. 누군가 프로젝트 외부의 파일을 읽거나 실행할 수 있게 만들 수 있는 문제였습니다. 제가 직접 가져온 의존성이었습니다.

보안 도구에 어떻게 치명적인 취약점이 있을 수 있을까요?

정답은 공급망(supply chain)에 있습니다. 제 코드는 정직할지 모릅니다. 하지만 제가 기반으로 삼는 도구들이 항상 안전한 것은 아닙니다. 보안 도구를 만드는 과정에서조차 이를 놓쳤다면, 일반적인 개발자가 이를 발견할 가능성은 전혀 없습니다.

이것이 제가 여전히 개발을 계속하는 이유입니다.

Semgrep과 같은 기존 도구들은 위험 패턴을 찾아냅니다. 알려진 취약점을 찾아내죠. 하지만 이들은 '의도(intent)'를 이해하지 못합니다. 코드가 실제로 무엇을 하려고 했는지 알지 못합니다.

함수 자체는 안전하더라도, 프로젝트에 존재해서는 안 될 문제를 해결하고 있는지는 판단할 수 없습니다.

저는 이것을 '의도 격차(intent gap)'라고 부릅니다. 코드와 그 목적 사이의 거리입니다.

vibeanalyzer는 이 격차에 집중합니다. 이 도구는 사용자에게 프로젝트의 의도와 비목표(non-goals)를 묻습니다. 그리고 가드레일을 설정합니다. AI가 코드를 평가할 때, 목표가 무엇인지, 무엇이 허용 범위를 벗어난 것인지 알 수 있게 됩니다.

의도 로딩(intent loading) 부분은 마쳤습니다. 기본적인 TypeScript 분석과 폴더 구조 그래프를 구현했습니다. 다음 단계는 AI 레이어를 구축하는 것입니다. AI가 의도에 따라 코드를 진정으로 평가할 수 있을지는 아직 모릅니다. 그저 오탐(false alarms)만 만들어낼 수도 있습니다. 이를 확인하기 위해 과정을 공개하며 개발할 예정입니다.

의존성을 업데이트하고 알려진 버그들을 해결했습니다. 하지만 알려지지 않은 구멍과 논리적 오류는 여전히 남아 있습니다. 그래서 작업은 계속됩니다.

Source: https://dev.to/stkremen/im-building-a-code-security-analyzer-a-security-tool-found-a-critical-in-it-4b77

Optional learning community: https://t.me/GyaanSetuAi