※個人の感想です。製品マニュアルではありません。

ManaPDFで、気を配ってるセキュリティのこと

社内の PDF が、いつの間にか書き換わっている気がした。調べるために GitHub から OSS を入れたら、自分がセキュリティ担当なのに EDR のアラートが上がった。

きっかけは、そんな少しきまずい体験でした。ManaPDF は「便利な PDF ツール」を作る前に、説明できる配布と端末内完結を優先しています。ここでは、その背景を個人的な思いと、技術的な整理の両方で書きます。

※ 社内システムや特定ベンダーの批判ではありません。法的な保証や社内承認の代わりにもなりません。プライバシーポリシーと ヘルプ もあわせてどうぞ。

ManaPDFのAbout画面でPolicy(ポリシー)を表示している例

Part1. きっかけ — 「サイレントに変わった?」

業務で配布されている PDF を、しばらく見ないうちに開き直すと、なぜか中身やプロパティが以前と違う——そんな違和感がありました。ユーザーが意識して保存し直したわけではなさそうなのに、Creator や更新日時、埋め込まれたメタデータだけが変わっている。いわゆるサイレント更新(利用者の操作を伴わない差し替え)ではないか、と疑い始めました。

調べるために、メタデータの比較やレポート出力ができる PDF 関連の OSS を GitHub から取得し、社内 PC で動かしてみました。正規の調査目的です。悪意のある行為ではありません。

それでも、エンドポイント保護(EDR)のアラートが上がりました。

セキュリティを見る立場なのに、「何のツールですか?」と聞かれる側になった。正直、きまずかった。

アラートの中身は、だいたい次のような文脈でした。

  • GitHub から取得した、あまり知名度のない実行ファイル
  • コード署名が付いていない、または社内で未登録の署名
  • PDF を開いて解析し、別ファイルに書き出す振る舞い

悪意がなくても、説明コストは発生します。「調査のためです」と言えば通ることもありますが、毎回そう説明したくはない。だから ManaPDF では、配布形態そのものを最初から設計に含めました。

パソコンの前で困るビジネスウーマン

Part2. PDF ツールは EDR に検知されやすい

これは ManaPDF だけの話ではありません。PDF を読み書きするアプリケーションは、エンドポイント保護製品からヒューリスティック(振る舞いベース)に検知されやすい類型です。仕様上、次のような処理を行うからです。

  • バイナリ形式の PDF をパースし、内部オブジェクト(ストリーム、辞書、暗号化エンベロープ)を解釈する
  • メタデータや本文テキストを抽出・書き換えし、新しいファイルとして保存する
  • 暗号化 PDF ではパスワード解除や再保存を行う(Unlock)
  • 添付・外部リンク・スクリプトなど、マルウェア分析でも注目される構造を触る

EDR から見ると、これは「文書を開いて改変する未知のアプリ」に見えます。正規の DTP ソフトでも誤検知は起こり得ますが、配布元が小さい・署名が弱い・利用実績がないほど、スコアは上がりやすいです。

配布形態も影響します。.NET アプリを自己完結型(single-file)で 1 つの exe にまとめて配布すると、起動時に一時ディレクトリへ展開する挙動が加わり、パッキングされた実行ファイルと類似した検知パターンに当たることがあります。ZIP から取り出した未署名の manapdf.exe をそのまま実行するのも、同様に説明が必要です。

「怪しい」のではなく、「警戒される設計になりやすい」——この言い方のほうが正確だと思っています。

クラウド型の PDF サービスは、アップロードの問題は残りますが、端末への未知 exe 導入は避けられます。ローカルツールはその逆です。ManaPDF はローカル完結を選んだぶん、署名と配布経路で説明責任を取る必要があると考えています。

サイバー犯罪のイメージイラスト

Part3. 署名が必要だから、Store 配布を優先した

社内でソフトを説明するとき、いちばん聞かれるのは「どこから入れたの?」と「署名は?」です。Windows では、実行ファイルのコード署名(Authenticode)と、既知の配布チャネルかどうかが、承認のハードルに直結します。

個人サイトや GitHub Releases から unsigned / 自己署名の ZIP を配る方法もありますが、セキュリティ担当として自分が使うのですらアラートが上がる——Part1 の体験がそれです。組織のポリシーによっては、そもそも許可されません。

だから ManaPDF の一般向け公式入手先は Microsoft Storeにしました。

  • Store 経由の MSIX は、Partner Center のパッケージ署名のもとで配布される
  • 「Microsoft Store の ManaPDF」として説明しやすい(社内のソフトウェア申請でも書きやすい)
  • GUI と CLI(manapdf App Execution Alias)を同じパッケージで届けられる

GitHub 上のソースは MIT ライセンスで公開していますが、一般ユーザー向けのバイナリ配布の主経路は Storeです。タグ付きリリースで Actions が作る CLI 用 ZIP / SBOM は、主にメンテナー自身の検証・追跡用(後述)で、Store とは別チャネルとして扱っています。

※ Store のインストール・更新・購入で Microsoft 側の通信が発生することは、ManaPDF 本体の PDF 処理とは別です。

力こぶを見せるビジネスマンのイラスト

Part4. ManaPDF が意識していること

配布形態とあわせて、アプリの振る舞い側でも線を引いています(GUI の Policy / manapdf policy と同じ方針です)。

  • 通常動作で PDF を外部へアップロードしない — 処理は端末内。テレメトリ・アカウント・オンライン認証も入れない
  • 入力ファイルを上書きしない — 結果は別名・別フォルダ。CLI で上書きするのは --force など明示時のみ
  • PDF 処理のためのネットワーク通信を行わない
  • 暗号化 PDF はパスワード入力後に処理 — パスワードはログや JSON に含めない
  • 依存ライブラリをアプリ内で開示 — About の Licenses、CLI の manapdf licenses、同梱の THIRD_PARTY_NOTICES

サイレント更新の調査がきっかけだったので、Compare や Report、メタデータの差分確認といった「いつ・何が変わったか」を見える化する機能にも力を入れています。ManaPDF が勝手に PDF を書き換えることはありませんが、他の経路で変わっていないかを確認する道具にはなれます。

メタデータの読み物で書いた「アップロードしたくない」「社内で説明したい」という話と、同じ根っこです。

ManaPDFのReport画面でPDF一覧を表示している例

Part5. ビルド・SBOM・GitHub Actions

「何をしているか」を文章だけでなく、ビルドの仕組みでも残したいと考えています。現状は次のとおりです。

継続的インテグレーション(CI)

main への push と pull request のたびに、GitHub Actions 上の Windows ランナーで dotnet restore → build → test を実行しています(.github/workflows/ci.yml)。Store に出す前の品質ゲートとして、手元ビルドだけに頼らないようにしています。

リリース時の SBOM とチェックサム

v* タグを push すると、別 workflow(.github/workflows/release.yml)が動きます。

  • CLI(manapdf.exe)を Release 構成で publish し、ZIP にパッケージング
  • CycloneDX 形式の SBOM(manapdf-vX.Y.Z-sbom.cdx.json)を dotnet-CycloneDX で生成
  • ZIP と SBOM の SHA-256 を checksums.txt に記録(タグ名・コミット SHA・workflow run URL 付き)
  • GitHub Release に ZIP / SBOM / checksums を添付
  • リポジトリが public のときは、GitHub Artifact Attestations(ビルド由来の証明)も付与

SBOM を一般ユーザー向けに常時公開しているわけではありません。 Store から入れた GUI パッケージに SBOM ファイルが同梱されているわけでもありません。いま公開しているのは、アプリ内のライセンス一覧と THIRD_PARTY_NOTICES、およびメンテナー向け GitHub Release 上の SBOM です。将来、Store 版向けにもっと明示的に出すかは検討中です。

それでも、「どのコミットから、どの workflow で、何が作られたか」は追跡できる状態にしておきたい。自分が EDR に引っかかったときと違い、後から説明できる材料を残すためです。

※ ソースは GitHub で公開しています。脆弱性は Security Advisories から(公開 issue ではなく)報告してください。

Part6. やらないこと・保証しないこと

ここは誤解されやすいので、はっきり書きます。

  • マルウェア除去・PDF の無害化はしない — ウイルス対策ソフトではありません
  • inspect は安全判定ではない — 確認項目の一覧表示のみ(CLI のみ)
  • PDF/A・PDF/X の準拠証明はしない
  • パスワードの解析・総当たりはしない
  • EDR の誤検知をゼロにするとは言えない — 振る舞いの性質上、組織のポリシー次第でブロックされる可能性はあります
  • 社内規程の判断は代行しない

「この PDF は安全です」とは言いません。「見なくていいデータを勝手に送らない」「入力を勝手に上書きしない」とは言えます。

疲れた表情でパソコンを見る会社員

気になったらどうぞ。

ManaPDF公式サイトを見る · ほかの読み物(メタデータの話) · ほかの読み物(Unlockの話) · プライバシーポリシー · Microsoft Storeで入手

Microsoft Storeで入手

補足. よくある質問(短め)

なぜ GitHub から入れた OSS でアラートが出るの?

署名がない・レピュテーションが低い・PDF の読み書きという振る舞い、などが重なると、EDR が「要確認」と判断しやすいからです。悪意があるとは限りません。

Store 版なら EDR に引っかからない?

保証はできません。ただし、コード署名付きの既知チャネル経由のほうが、社内説明とポリシー適合はしやすいことが多いです。

SBOM はどこで見られる?

一般向けの常設ダウンロードはしていません。タグ付き GitHub Release には CLI 向け CycloneDX SBOM を添付しています。アプリ内では manapdf licenses / About の Licenses で依存関係を確認できます。

本当にネットに PDF を送らないの?

通常の PDF 処理では、ManaPDF 本体が文書を外部サービスへアップロードしません。Store のインストール・更新など OS 側の通信は別です。

入力 PDF は上書きされる?

しません。結果は別ファイル・別フォルダです。