> ## Content Index
> Fetch the complete content index at: https://blog.frostk.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# NOIR 점수는 유출 확률이 아니에요, 카카오톡 분류도 따로 봐야 해요
- URL: https://blog.frostk.com/noir-risk-score/
- Published: 2026-11-10T01:00:00.000Z
- Updated: 2026-11-10T01:00:00.000Z
- Description: NOIR의 위험 점수는 민감 권한 수에 시스템 앱 여부와 URL 패턴 등의 가산점을 더한 값이에요. 코드를 읽어 실제 가중치와 분류 우선순위를 확인했어요. 카카오톡과 네이버 앱에 전용 분류가 없는 현재 규칙을 기준으로, 보고서에서 무엇을 먼저 살펴볼지 정리해요.
- Author: Cat
- Tags: 앱, 보안, 오픈소스

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

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

## 화면의 점수보다 먼저 볼 것

![기기 정보, 분류별 막대, 앱별 SCORE와 CATEGORY, 조치 계획이 나뉜 NOIR 터미널 대시보드](https://blog.frostk.com/content/images/2026/11/49748848.png)

제작자 Verlintas의 공식 예시예요. 출처: NOIR README와 docs/screenshot.png, MIT © 2026 Verlintas.

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

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

![권한과 APK 주소를 모아 캐시와 분류·점수 계산을 거치고, 보고서와 조치 파일로 나누는 구조](https://blog.frostk.com/content/images/2026/11/hf-68799685.png)

점수 다음에 Advisor가 조치를 제안해요. rollback.txt는 실제 조치를 실행한 뒤의 복구 기록이에요.

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

기본 스캔은 인터넷 권한과 민감 권한이 있는 앱을 후보로 삼아요. 점수 함수에 넘기는 것도 전체 권한 목록이 아니라 `SENSITIVE` 목록에 해당하는 권한들이에요. [호출부](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/cli/src/main/kotlin/app/noir/cli/Main.kt?ref=blog.frostk.com#L856-L875)와 [점수 함수](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/core/src/commonMain/kotlin/app/noir/core/Rules.kt?ref=blog.frostk.com#L66-L80)를 함께 보면 다음처럼 읽을 수 있어요.

| 입력 조건                                                   | 기본 권한 수 외에 더하는 값 |
| ------------------------------------------------------- | ---------------- |
| 전체 앱 목록 조회 QUERY\_ALL\_PACKAGES                         | +2               |
| 특권 전화 상태 읽기 READ\_PRIVILEGED\_PHONE\_STATE              | +3               |
| 화면 캡처용 포그라운드 서비스 FOREGROUND\_SERVICE\_MEDIA\_PROJECTION | +4               |
| 시스템 앱                                                   | +2               |
| 디버깅 가능 앱                                                | +2               |
| 명령형 URL 패턴이 하나 이상 있음                                    | +2               |
| 업로드형 URL 패턴이 하나 이상 있음                                   | +3               |

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

URL 가산점은 전송량을 재지 않아요. [패턴 검사](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/core/src/commonMain/kotlin/app/noir/core/Rules.kt?ref=blog.frostk.com#L47-L64)는 `?`와 `#` 뒤를 제외한 문자열에서 `/upload`, `/analytics`, `/crash` 같은 경로 패턴을 찾아요. 명령형은 `/command`, `/execute` 등이에요. 두 조건 모두 `any` 검사라 해당 종류의 패턴을 여러 개 찾아도 그 종류의 가산점은 한 번만 붙어요.

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

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

현재 [분류 코드](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/core/src/commonMain/kotlin/app/noir/core/Classifier.kt?ref=blog.frostk.com#L119-L206)에는 카카오톡과 네이버 앱의 전용 카테고리 항목이 없어요. 공식 Google Play 주소의 패키지명은 각각 `com.kakao.talk`, `com.nhn.android.search`예요. 두 이름은 코드의 일반 소셜 앱 이름 검사에도 들어 있지 않아요.

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

![고정 분류, 기능 이름, 통계·광고 패턴, 나머지 규칙과 기본값 순서로 처음 맞는 분류를 선택해요](https://blog.frostk.com/content/images/2026/11/hf-24414123.png)

통계·광고보다 앞서는 기능 이름 규칙이 있어요. 통계·광고 뒤에도 다른 기능 규칙이 남아 있어요.

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

제조사·서비스 이름을 붙이는 `vendor`도 별도예요. [코드](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/core/src/commonMain/kotlin/app/noir/core/Classifier.kt?ref=blog.frostk.com#L149-L168)는 등록된 패키지 접두사를 우선하고, 못 찾으면 제외 대상 호스트를 빼고 알려진 도메인과 일치하는 횟수로 추정해요. 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![](https://blog.frostk.com/content/images/icon/favicon-b26fd236-0234-4536-84bb-f0702ae84531.png)GitHub![](https://blog.frostk.com/content/images/thumbnail/NOIR-84dcd4e9-9440-4192-b083-720ebec2b990.png)](https://github.com/Verlintas/NOIR?ref=blog.frostk.com)

[점수 규칙](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/core/src/commonMain/kotlin/app/noir/core/Rules.kt?ref=blog.frostk.com), [분류 규칙](https://github.com/Verlintas/NOIR/blob/aed4e3b71a5023f4de368956a8d1266a4b0669e6/core/src/commonMain/kotlin/app/noir/core/Classifier.kt?ref=blog.frostk.com), [카카오톡 공식 설명](https://play.google.com/store/apps/details?id=com.kakao.talk&hl=ko&ref=blog.frostk.com), [네이버 공식 설명](https://play.google.com/store/apps/details?id=com.nhn.android.search&hl=ko&ref=blog.frostk.com)을 대조했어요.