# 보안과 개인정보

Spam Scanner는 비공개 데이터인 메일을, 적대적일 수 있는 발신자로부터 받아 읽습니다. 이 페이지에서는 Spam Scanner가 외부로 보내는 모든 것과, 읽은 내용을 다루는 방식을 설명합니다.


## 컴퓨터 밖으로 나가는 데이터

기본적으로는 한 가지뿐입니다. 메시지에 있는 **링크의 호스트 이름**을 Cloudflare의 필터링 리졸버에서 조회합니다. 1.1.1.2와 1.0.0.2(악성코드와 피싱), 1.1.1.3과 1.0.0.3(성인 콘텐츠 포함)입니다. 이는 `example.com` 같은 이름에 대한 일반 DNS 조회이며, 메시지나 주소의 어떤 부분도 전송하지 않습니다. `phishing: {cloudflare: false}` 또는 `--no-cloudflare`로 끌 수 있고, 성인 콘텐츠 검사만 끄려면 `phishing: {adult: false}`를 사용합니다.

그 밖의 모든 것은 설정하기 전까지 꺼져 있습니다.

| 검사                  | 보내는 데이터                                   | 받는 곳                                       |
| ------------------- | ----------------------------------------- | ------------------------------------------ |
| `authentication`    | 발신자의 SPF, DKIM, DMARC, ARC 레코드에 대한 DNS 조회 | 사용 중인 리졸버 또는 `dnsServers`                  |
| `dnsbl`             | 뒤집은 클라이언트 IP 주소와 링크 도메인을 담은 DNS 조회        | 사용 중인 리졸버나 `dns.servers`를 거쳐 차단 목록의 네임 서버로 |
| `llm`               | 메시지 요약(원격 제공자에게는 개인 데이터를 제거하고 보냄)         | 지정한 언어 모델 서버([개인정보 보호](https://spamscanner.net/ko/docs/llm/#privacy))    |
| `reputation.apiUrl` | 발신자의 IP 주소, 도메인, 주소                       | 지정한 서비스                                    |
| `clamav`            | 첨부 파일                                     | 소켓을 통해 사용 중인 clamd로                        |

원격 측정, 업데이트 확인, 실행 중 다운로드는 없습니다. 모델은 패키지 안에 포함되어 배포됩니다.


## 보관하는 데이터

요청하지 않는 한 아무것도 보관하지 않습니다. 검사는 기록하거나 저장하지 않습니다. `learn()`은 메모리에 있는 분류기를 변경하며, 디스크에는 `saveModel()`, `spamscanner learn`, 또는 서버의 `--out` 옵션으로만 기록됩니다. 모델 파일에는 단어나 메시지 텍스트가 아니라 해시된 특징 개수가 들어 있습니다.

언어 모델의 답변은 보낸 내용의 해시를 키로 메모리에 캐시되므로, 같은 메시지가 반복해서 와도 한 번만 묻습니다. DNS 응답은 10분 동안 메모리에 캐시됩니다.


## 적대적인 입력

* 첨부 파일은 바이트로 식별하며, 실행하거나 다른 프로그램으로 열지 않습니다. ZIP 압축 파일은 항목 수 제한을 두고 중앙 디렉터리에서 읽으며, 중첩된 압축 파일은 풀지 않습니다.
* 본문 텍스트는 `maxLength`(100,000자)까지만 읽으며, 서버는 25MB까지의 메시지를 받습니다.
* 모든 네트워크 검사에는 제한 시간(`timeout`, 기본 10초)이 있습니다. 실패하거나 시간이 초과된 검사는 건너뛰고, 그 검사 없이 검사를 마칩니다.
* 메시지에 이미 있는 `X-Spam-*` 헤더는 milter, 콘텐츠 필터, `--headers`가 제거하므로, 발신자가 자기 메일을 정상으로 표시할 수 없습니다.
* Microsoft의 스팸 판정 헤더는 메시지가 Microsoft 서버에서 직접 왔을 때만 신뢰하며, Received 헤더는 메시지의 출처를 판단하는 데 결코 쓰지 않습니다.
* AI 필터를 겨냥한 텍스트는 스팸으로 점수가 매겨지며, 언어 모델에는 메시지가 지시가 아니라 데이터라고 알려 줍니다. [프롬프트 인젝션](https://spamscanner.net/ko/docs/llm/#prompt-injection)


## 서버

milter, HTTP, TCP, spamd 서버는 `--host`로 달리 지정하지 않는 한 127.0.0.1에서 수신합니다. HTTP API는 토큰을 상수 시간으로 비교하며, 토큰이 없으면 `/learn`을 거부합니다. 어느 서버도 TLS를 지원하지 않습니다. 네트워크를 거쳐 접속하려면 사설 네트워크, SSH 터널, 또는 TLS를 쓰는 리버스 프록시를 사용하십시오.

권한이 없는 사용자로 실행하십시오. [Postfix 가이드의 systemd 유닛](https://spamscanner.net/ko/docs/postfix/#1-run-the-milter)에는 일반적인 보안 강화 설정이 들어 있습니다.


## 취약점 신고

보안 문제는 공개 이슈가 아니라 [GitHub의 취약점 신고 기능](https://github.com/spamscanner/spamscanner/security/advisories/new)으로 비공개 신고하십시오.
