セキュリティとプライバシー
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 | メッセージの要約(リモートのプロバイダーには個人データを削除して送る) | 指定した言語モデルのサーバー(プライバシー) |
reputation.apiUrl | 送信者のIPアドレス、ドメイン、アドレス | 指定したサービス |
clamav | 添付ファイル | 自分のclamd(ソケット経由) |
テレメトリー、更新の確認、実行時のダウンロードは一切ありません。モデルはパッケージに含まれています。
保持するもの#
求められない限り、何も保持しません。スキャンはログに記録も保存もされません。learn()はメモリ上の分類器を変更するだけで、ディスクに書き込まれるのはsaveModel()、spamscanner learn、サーバーの--outオプションを使った場合だけです。モデルファイルが保持するのはハッシュ化した特徴の件数で、単語やメッセージのテキストは含みません。
言語モデルの回答は、送った内容のハッシュをキーとしてメモリにキャッシュされるため、同じメッセージの複製について問い合わせるのは1回だけです。DNSの回答は10分間メモリにキャッシュされます。
敵対的な入力#
- 添付ファイルはバイト列で識別し、実行したり別のプログラムで開いたりすることはありません。ZIPアーカイブはセントラルディレクトリから読み、エントリ数に上限を設けています。入れ子になったアーカイブは展開しません。
- 本文のテキストは
maxLength(100,000文字)まで読み、サーバーは25 MBまでのメッセージを受け付けます。 - すべてのネットワーク検査にはタイムアウト(
timeout、デフォルトは10秒)があります。失敗またはタイムアウトした検査はスキップされ、スキャンはその検査なしで完了します。 - メッセージにすでにある
X-Spam-*ヘッダーは、milterメールフィルター。Sendmail由来でPostfixも使うプロトコルで、別のプログラムがSMTPセッション中に各メッセージを検査できるようにします。、コンテンツフィルター、--headersが削除するため、送信者が自分のメールを問題なしと偽ることはできません。 - Microsoftのスパム判定ヘッダーは、メッセージがMicrosoftのサーバーから直接届いた場合にだけ信頼します。また、メッセージがどこから来たかの判断にReceivedヘッダーを使うことはありません。
- AIフィルターに宛てたテキストはスパムとして採点し、言語モデルにはメッセージが指示ではなくデータであることを伝えます。プロンプトインジェクション
サーバー#
milter、HTTP、TCP、spamdの各サーバーは、--hostで指定しない限り127.0.0.1で待ち受けます。HTTP APIはトークンを定数時間で比較し、トークンなしの/learnは拒否します。どのサーバーもTLSを話しません。ネットワーク越しに接続するには、プライベートネットワーク、SSHトンネル、TLSを使うリバースプロキシのいずれかを使ってください。
サーバーは特権のないユーザーで実行してください。Postfixガイドのsystemdユニットには、一般的なハードニングの設定が含まれています。
脆弱性の報告#
セキュリティの問題は、公開のissueではなく、GitHubの脆弱性報告から非公開で報告してください。