본문으로 건너뛰기 Hacktron 로그인 [S]
Hacktron 로그인 [S] 고객 사례 블로그 문서 문의 로그인

Hacktron이 Novu 보안 팀에 더 많은 프로세스가 아닌 확신을 주는 방법


Novu
Hacktron Review

, , X, LinkedIn

공유

Hacktron이 Novu 보안 팀에 더 많은 프로세스가 아닌 확신을 주는 방법

XLinkedIn
4분
보안 이슈 28건 수정
첫 30일 동안
발견 사항의 83%
노이즈가 아닌 조치 가능한 항목
NoSQL 인젝션
다른 도구가 놓친 취약점

“마치 모든 PR을 침투 테스터가 검토해 주는 것 같습니다.”

Dima Grossman
CTO

Novu 소개

Novu는 오픈 소스 알림 인프라 플랫폼입니다. 하나의 API로 15개 이상의 채널(인앱, 이메일, SMS, 푸시)에 알림을 보낼 수 있으며, 클라우드 배포와 에어갭 온프레미스 배포 모두에서 사용됩니다. 이 프로젝트는 GitHub 스타 39,000개를 받았고, 오픈 소스 에디션에는 400명이 넘는 외부 기여자가 있습니다. 현재는 Novu Connect로 양방향 에이전트 커뮤니케이션까지 영역을 넓히고 있으며, AI 에이전트가 사용자를 다른 곳으로 안내하는 데 그치지 않고 Slack 등의 채널 안에서 직접 작업을 완료할 수 있게 합니다.

과제: 400명의 기여자가 손대는 코드베이스를 신뢰하는 일

Novu는 모든 외부 기여에 제로 트러스트 정책을 적용합니다. 외부 기여자가 400명이 넘기 때문에 검증 없이 배포되는 것은 없습니다. 지금은 두 가지 변화가 동시에 일어나고 있습니다. AI로 Novu가 배포하는 코드의 양이 늘고 있고, 팀은 컴플라이언스 목적의 벤더 보안 심사가 실제로 무엇을 잡아내는지에 회의적이 되었습니다.

“매년 벤더 심사를 하면 할수록 신뢰가 줄어듭니다. 맡은 모든 회사에 똑같은 10개 항목짜리 플레이북을 돌리고, 대개는 별로 관련 없는 것들을 찾아냅니다.

“체크 표시는 채워지지만, 내부적으로는 그 결과를 전혀 신뢰하지 않습니다.”

Dima Grossman
CTO

Novu는 이미 여러 겹의 도구(CodeQL, Greptile, Cursor의 보안 리뷰어, 주기적인 DeepSec 스캔)를 모든 PR 제출 시점과 릴리스 태그를 달기 전, 두 차례의 검사 지점에서 실행하고 있습니다.

“AI 덕분에 제품 표면 영역 측면에서 더 많은 결과물을 만들어 내고 있습니다.

“그러니 당연히 리뷰 과정에서 사람의 실수가 끼어들 여지도 훨씬 커집니다.”

Dima Grossman
CTO

Hacktron의 역할: 프로세스 변경이 아닌 확신

Dima는 무엇이 바뀌었고 무엇이 바뀌지 않았는지 분명하게 말했습니다.

“Hacktron을 도입하면서 프로세스는 하나도 바뀌지 않았습니다. 실제로 바뀐 것은 확신의 수준뿐입니다. 훨씬 정교한 패턴까지 잡아내고 있다는 것을 알게 되었습니다.

“그리고 그 확신 덕분에 속도도 높일 수 있습니다.”

Dima Grossman
CTO

그 확신은 신호 품질에서 나옵니다. Novu의 기존 도구는 대부분 PR의 diff에서 보이는 이슈를 표시합니다(Dima는 이를 “원홉” 익스플로잇이라고 불렀습니다). Hacktron은 저장소의 코드 그래프를 만들고 PR마다 그래프의 차이를 비교해 2차 이슈를 찾아냅니다. 한 파일의 변경이 시스템의 다른 곳에 있는 코드에 어떤 영향을 주는지 추적해야만 보이는 취약점입니다.

“다른 도구의 댓글을 보면 많은 경우 범위 밖이거나 수용 가능한 위험입니다.

“Hacktron이 무언가를 보고하면 팀이 주의를 기울이고 고민합니다. 많은 경우 꽤 관련성이 높다는 것을 확인합니다.”

Dima Grossman
CTO

Dima는 자신이 적극적으로 관리하고 있는 위험으로 노이즈 피로도 꼽았습니다.

“양치기 소년 같은 도구가 되면 안 됩니다.

“보고서에 알림이 너무 많으면 핵심을 놓치기 시작합니다.”

Dima Grossman
CTO

여기서 신호 품질은 있으면 좋은 정도의 요소가 아닙니다. 팀이 실제로 읽는 도구와 무시하는 법을 익히게 되는 도구를 가르는 차이입니다.

발견 사항 분석

Novu가 Hacktron을 사용한 첫 30일(2026년 7월 6일~8월 6일) 동안:

230개 풀 리퀘스트61건 발견, 42건 분류28건 해결1건 정탐6건 위험 수용7건 오탐 230개 풀 리퀘스트61건 발견, 42건 분류28건 해결1건 정탐6건 위험 수용7건 오탐

18건의 발견 사항은 아직 분류를 기다리고 있습니다. 1건은 해당 PR이 중단되면서 철회되었습니다.

어떤 취약점을 찾나요?

Novu의 자체 도구는 대부분 단일 파일이나 단일 PR diff에서 보이는 이슈를 잡아냅니다. Dima가 가치 있다고 꼽은 발견 사항은 여러 파일에 걸친 호출을 추적해야만 드러나는 것들로, 패턴 매칭 스캐너로는 표시할 방법이 전혀 없는 유형입니다.

NoSQL 인젝션과 대화 간 권한 부여 우회 (높음)

PR #12062에서 발견되어, 병합 전 같은 PR에서 수정되었습니다.

Novu는 자체 호스팅 AI 에이전트가 구조화된 이벤트(메시지, 답장, 승인)를 플랫폼으로 보낼 수 있도록 새로운 수집 경로를 도입하고 있었습니다. 이 파이프라인의 한 부분은 클라이언트가 제공한 메시지 ID를 매칭해, 들어온 이벤트를 올바른 대화 활동에 다시 연결해야 했습니다.

private async resolveActivityByClientId(
environmentId: string,
conversationId: string,
messageId: string
): Promise<ConversationActivityEntity | null> {
for (let attempt = 0; attempt < ACTIVITY_RESOLVE_MAX_ATTEMPTS; attempt += 1) {
const activity = await this.activityRepository.findOne(
{ _environmentId: environmentId, identifier: messageId },
'*'
);
if (activity) {
return activity;
}
if (attempt < ACTIVITY_RESOLVE_MAX_ATTEMPTS - 1) {
await delay(ACTIVITY_RESOLVE_DELAY_MS);
}
}
return this.activityRepository.findByPlatformMessageId(environmentId, conversationId, messageId);
}

여기서는 두 가지 문제가 겹쳤습니다. 첫째, 쿼리 필터는 활동이 어느 대화에 속하는지 확인하지 않고 환경만 확인했습니다. 둘째, 들어오는 messageId가 그 필터에 그대로 쓰이기 전에 일반 문자열인지 검증되지 않아, ID 대신 MongoDB 쿼리 연산자로 바꿔 넣을 수 있었습니다. 이 둘이 결합되어, 인증된 호출자는 자신의 것이 아닌 대화에 속한 활동을 조회한 뒤 수정하거나 삭제할 수 있었습니다.

Hacktron Review는 세 파일에 걸친 호출 체인을 추적해 이 문제를 잡아냈습니다. 원시 이벤트 페이로드를 받는 수집 컨트롤러, 깊은 검증 없이 이를 타입이 지정된 이벤트로 변환하는 유스 케이스, 검증되지 않은 ID를 위 쿼리에 전달하는 싱크 서비스입니다.

결과: 더 느리게가 아니라 더 빠르게 배포할 수 있는 확신

Novu는 400명이 넘는 외부 기여자가 손대는 코드베이스 전반에서 지속적인 리뷰를 받습니다. 팀이 보안 도구를 더 이상 읽지 않게 만드는 노이즈 피로는 없고, 더 느리게가 아니라 더 빠르게 배포할 수 있게 해 주는 확신은 얻었습니다.

고객 사례

문의

데모를 예약하거나 무료로 시작하세요.

[↓] [↑] [enter] 키로 이동
메뉴
[M]
메뉴의 다음 항목
[J]
메뉴의 이전 항목
[K]
검색
[F]
질문하기
[A]
로그인
[S]
페이지 복사
[C]
듣기
[L]
양쪽 정렬
[R]
언어
[G]
다크 모드
[D]
고대비
[H]
단축키
[I]
닫기
[Esc]