# セキュリティとプライバシー

Spam Scannerが読むのは、私的な内容であるメールで、その送信者は敵対的な場合があります。このページでは、Spam Scannerがどこに何を送るか、そして読んだものをどう扱うかを説明します。


## マシンの外に出るもの

デフォルトでは1つだけです。メッセージ内の**リンクのホスト名**を、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/ja/docs/llm/#privacy)）    |
| `reputation.apiUrl` | 送信者のIPアドレス、ドメイン、アドレス                   | 指定したサービス                                    |
| `clamav`            | 添付ファイル                                 | 自分のclamd（ソケット経由）                            |

テレメトリー、更新の確認、実行時のダウンロードは一切ありません。モデルはパッケージに含まれています。


## 保持するもの

求められない限り、何も保持しません。スキャンはログに記録も保存もされません。`learn()`はメモリ上の分類器を変更するだけで、ディスクに書き込まれるのは`saveModel()`、`spamscanner learn`、サーバーの`--out`オプションを使った場合だけです。モデルファイルが保持するのはハッシュ化した特徴の件数で、単語やメッセージのテキストは含みません。

言語モデルの回答は、送った内容のハッシュをキーとしてメモリにキャッシュされるため、同じメッセージの複製について問い合わせるのは1回だけです。DNSの回答は10分間メモリにキャッシュされます。


## 敵対的な入力

* 添付ファイルはバイト列で識別し、実行したり別のプログラムで開いたりすることはありません。ZIPアーカイブはセントラルディレクトリから読み、エントリ数に上限を設けています。入れ子になったアーカイブは展開しません。
* 本文のテキストは`maxLength`（100,000文字）まで読み、サーバーは25 MBまでのメッセージを受け付けます。
* すべてのネットワーク検査にはタイムアウト（`timeout`、デフォルトは10秒）があります。失敗またはタイムアウトした検査はスキップされ、スキャンはその検査なしで完了します。
* メッセージにすでにある`X-Spam-*`ヘッダーは、milter、コンテンツフィルター、`--headers`が削除するため、送信者が自分のメールを問題なしと偽ることはできません。
* Microsoftのスパム判定ヘッダーは、メッセージがMicrosoftのサーバーから直接届いた場合にだけ信頼します。また、メッセージがどこから来たかの判断にReceivedヘッダーを使うことはありません。
* AIフィルターに宛てたテキストはスパムとして採点し、言語モデルにはメッセージが指示ではなくデータであることを伝えます。[プロンプトインジェクション](https://spamscanner.net/ja/docs/llm/#prompt-injection)


## サーバー

milter、HTTP、TCP、spamdの各サーバーは、`--host`で指定しない限り127.0.0.1で待ち受けます。HTTP APIはトークンを定数時間で比較し、トークンなしの`/learn`は拒否します。どのサーバーもTLSを話しません。ネットワーク越しに接続するには、プライベートネットワーク、SSHトンネル、TLSを使うリバースプロキシのいずれかを使ってください。

サーバーは特権のないユーザーで実行してください。[Postfixガイドのsystemdユニット](https://spamscanner.net/ja/docs/postfix/#1-run-the-milter)には、一般的なハードニングの設定が含まれています。


## 脆弱性の報告

セキュリティの問題は、公開のissueではなく、[GitHubの脆弱性報告](https://github.com/spamscanner/spamscanner/security/advisories/new)から非公開で報告してください。
