본문 바로가기
FrostK
테마 색상
로그인

읽는 데 8분Cat

NOIR 점수는 유출 확률이 아니에요, 카카오톡 분류도 따로 봐야 해요

앱 보안 오픈소스
NOIR 점수는 유출 확률이 아니에요, 카카오톡 분류도 따로 봐야 해요

휴대폰 감사 보고서에서 어떤 앱은 36점, 다른 앱은 31점이라면 무엇부터 볼까요? NOIR의 score는 유출 확률이 아니라 민감 권한 수와 몇 가지 조건을 더한 점수예요. 업로드처럼 보이는 주소가 하나라도 있으면 3점을 더하지만, 그런 주소가 늘 때마다 계속 더하지는 않아요.

Verlintas가 만든 MIT 라이선스 도구 NOIR는 컴퓨터에서 Android 기기를 연결해 앱 권한과 APK 안의 주소 문자열을 함께 보여 줘요. 공식 지원 환경은 macOS, Windows 10/11, Debian/Ubuntu예요. 이번에는 실제 기기 시험 대신 점수와 분류 코드를 읽어, 보고서를 해석할 때 필요한 부분을 확인했어요.

화면의 점수보다 먼저 볼 것

기기 정보, 분류별 막대, 앱별 SCORE와 CATEGORY, 조치 계획이 나뉜 NOIR 터미널 대시보드
제작자 Verlintas의 공식 예시예요. 출처: NOIR README와 docs/screenshot.png, MIT © 2026 Verlintas.

공식 화면은 위에서부터 기기 정보, 분류별 앱 분포, 점수 상위 앱, 조치 계획으로 나뉘어요. 상위 목록의 CATEGORY는 앱 용도의 추정이고, SCORE는 점수예요. 같은 행에 있다고 해서 분류 이름 자체가 점수의 이유인 것은 아니에요. Rules.score는 분류 값을 입력으로 받지 않아요.

주소도 실제 접속 기록과 구별해야 해요. NOIR는 APK의 실행 코드 파일인 dex에서 URL 문자열을 뽑아요. README도 이를 정적 증거라고 설명하며, 특정 전송이 일어났다는 증명은 못 한다고 명시해요. 화면의 숫자는 조사할 항목을 고르는 단서로 읽는 편이 맞아요.

권한과 APK 주소를 모아 캐시와 분류·점수 계산을 거치고, 보고서와 조치 파일로 나누는 구조
점수 다음에 Advisor가 조치를 제안해요. rollback.txt는 실제 조치를 실행한 뒤의 복구 기록이에요.

점수가 오르는 조건은 정해져 있어요

기본 스캔은 인터넷 권한과 민감 권한이 있는 앱을 후보로 삼아요. 점수 함수에 넘기는 것도 전체 권한 목록이 아니라 SENSITIVE 목록에 해당하는 권한들이에요. 호출부와 점수 함수를 함께 보면 다음처럼 읽을 수 있어요.

입력 조건 기본 권한 수 외에 더하는 값
전체 앱 목록 조회 QUERY_ALL_PACKAGES +2
특권 전화 상태 읽기 READ_PRIVILEGED_PHONE_STATE +3
화면 캡처용 포그라운드 서비스 FOREGROUND_SERVICE_MEDIA_PROJECTION +4
시스템 앱 +2
디버깅 가능 앱 +2
명령형 URL 패턴이 하나 이상 있음 +2
업로드형 URL 패턴이 하나 이상 있음 +3

위의 세 권한도 기본 권한 개수에 먼저 들어가고 추가 점수가 붙어요. 시스템 앱이라는 조건만으로도 점수가 오르니, 높은 점수를 곧바로 악성 판정으로 바꾸면 곤란해요.

URL 가산점은 전송량을 재지 않아요. 패턴 검사는 ?와 # 뒤를 제외한 문자열에서 /upload, /analytics, /crash 같은 경로 패턴을 찾아요. 명령형은 /command, /execute 등이에요. 두 조건 모두 any 검사라 해당 종류의 패턴을 여러 개 찾아도 그 종류의 가산점은 한 번만 붙어요.

그래서 점수가 비슷한 두 앱을 비교할 때는 권한 목록과 URL을 따로 펼쳐 보세요. 정상 기능에 필요한 권한이 많은지, 주소 문자열이 어느 조건에 걸렸는지부터 보는 거예요. 총점만으로 실제 전송 빈도나 데이터 양을 비교할 수는 없어요.

카카오톡과 네이버는 이름표를 다시 확인해요

현재 분류 코드에는 카카오톡과 네이버 앱의 전용 카테고리 항목이 없어요. 공식 Google Play 주소의 패키지명은 각각 com.kakao.talk, com.nhn.android.search예요. 두 이름은 코드의 일반 소셜 앱 이름 검사에도 들어 있지 않아요.

분류 순서가 그래서 중요해요. 알려진 패키지의 고정 분류를 먼저 찾고, 없으면 기능을 짐작할 수 있는 패키지명부터 검사해요. 그 뒤에야 패키지명과 URL에 통계·광고 패턴이 있는지 봐요. 어디에도 맞지 않으면 시스템 앱 여부에 따라 SYSTEM 또는 OTHER가 돼요.

고정 분류, 기능 이름, 통계·광고 패턴, 나머지 규칙과 기본값 순서로 처음 맞는 분류를 선택해요
통계·광고보다 앞서는 기능 이름 규칙이 있어요. 통계·광고 뒤에도 다른 기능 규칙이 남아 있어요.

이 규칙대로라면 카카오톡도 URL에 통계 패턴이 잡히는 조건에서는 TELEMETRY로 분류될 수 있어요. 이것은 코드를 읽어 도출한 조건부 해석이며, 카카오톡을 스캔해서 얻은 결과는 아니에요. 반대로 앞선 기능 이름에 맞아 다른 카테고리가 나왔다고 해서 광고 주소가 없다고 해석해서도 안 돼요. 카테고리는 검사 순서에 따른 이름표예요.

제조사·서비스 이름을 붙이는 vendor도 별도예요. 코드는 등록된 패키지 접두사를 우선하고, 못 찾으면 제외 대상 호스트를 빼고 알려진 도메인과 일치하는 횟수로 추정해요. Samsung 규칙은 있지만 Kakao와 Naver 전용 규칙은 없어요. 따라서 국내 앱에서 다른 서비스 이름이 보여도 앱 제작사를 확정하기보다 포함된 SDK나 주소부터 확인해야 해요.

어디까지 쓰는 게 맞을까요

자기 Android 기기나 허가받은 기기에서 권한과 주소 목록을 모아 검토하려는 독자에게는 쓸모가 있어요. 시작 조건은 컴퓨터의 NOIR와 Android 연결 도구 adb, 기기의 USB 디버깅 허용이에요. 설치 세부는 공식 README에 맡기고, 처음에는 조치를 적용하지 않는 noir scan으로 보고서부터 읽는 쪽을 권해요.

보고서를 받으면 관심 앱의 패키지를 찾고, 민감 권한과 URL을 살펴본 뒤, 분류 규칙이 그 앱에 맞는지 확인해 보세요. 그다음 실제 통신을 확인할 필요가 있는 앱을 추리는 거예요. 국내 앱을 자동으로 정확하게 분류하거나 총점 순서대로 차단하는 도구를 원한다면, 여기서 확인한 규칙만으로는 기대를 충족하기 어려워요.

확인한 범위

  • 기준일: 2026-11-10. 코드 기준은 aed4e3b71a5023f4de368956a8d1266a4b0669e6예요.
  • 직접 한 것: README와 점수 호출부·가중치·분류 우선순위를 대조하고, 카카오톡·네이버의 공식 패키지명과 분류 규칙의 공백을 비교했어요. 기존 한국어 소개가 미확인으로 남긴 가중치를 소스로 확인했어요.
  • 읽은 것: README, Rules.kt, Classifier.kt, Main.kt의 기본 스캔 부분, DeviceScan.kt, LICENSE, 두 앱의 Google Play 설명과 기존 한국어 소개 두 편이에요.
  • 확인하지 못한 것: 실제 기기에서 나온 점수와 국내 앱의 최종 라벨, 분류 정확도, 실제 전송 여부와 조치 후 기능 영향은 시험하지 않았어요. 화면은 제작자의 공식 예시예요.

출처

GitHub - Verlintas/NOIR: 手机隐私审计:用 adb 扫出 Android 应用的权限、上报端点与数据流向,并给出可回滚的处置。Desktop Android leak audit: permissions, endpoints, data flows, reversible fixes.
手机隐私审计:用 adb 扫出 Android 应用的权限、上报端点与数据流向,并给出可回滚的处置。Desktop Android leak audit: permissions, endpoints, data flows, reversible fixes. - Verlintas/NOIR

점수 규칙, 분류 규칙, 카카오톡 공식 설명, 네이버 공식 설명을 대조했어요.