Skip to content

技術仕様・ライセンス・セキュリティモデル

セキュリティ方針

すべての入力は信頼しない、という方針で設計・実装しています。エンジンはzero-networkで、ネットワーク接続の機能自体がありません。

テンプレート、params、フォント、画像、検証対象のPDFはすべて、信頼できない入力として扱ってパースします。

  • フォントはファイルごとにsha256をロード時に検証し、OS/2の埋め込み権利ビット(fsType)を確認します。埋め込みが制限されたフォントは、manifest.ymlで明示的に許可を宣言しない限り拒否されます
  • 画像アセットは、ルートの外に出るパスを拒否します(asset_traversal)。リモートURLも拒否します。レンダリング処理には、そもそもネットワークI/Oのコードがありません
  • テンプレートのパスがテンプレートルートの外に出る場合はtemplate_escapes_rootで拒否します。paramsからの動的画像は、ホストのポリシー(許可/拒否リスト)で明示的に許可した項目だけが通ります
  • パーサはlibFuzzerでファジングしています(make fuzz)。過去にクラッシュした入力は保存してあり、毎回再実行して回帰を防ぎます

検証レポートには、確認しなかった項目も明記されます。 署名が実際にカバーしているバイト範囲を報告し、一部しかカバーしていない署名は偽造として扱います。信頼する証明書は呼び出しのたびに明示的に指定するもので、マシンの証明書ストアは参照しません。

サプライチェーンも検査しています。

  • cargo-denyでアドバイザリとライセンスを検査していて、アドバイザリのignoreはゼロです。除外設定(ignore)を足さないと検査を通らない依存は、採用しません
  • CycloneDX SBOMをリポジトリにコミットしています(sbom/)。engine 255 / gui 243 / sdk-js 127コンポーネントです。ロックファイル自体をスキャンして生成し、そのロックファイルのsha256を記録しているので、どの解決結果を写したものかが後から確かめられます。更新はリリースごとなので、リリース間の依存の動きはまだ入っていないことがあります
  • npm側は、pnpmのminimumReleaseAge7日に設定しています。公開から7日未満のパッケージはインストール自体が失敗するので、不正なリリースが公開されても、取り下げられる前にインストールしてしまうことを防げます。postinstallスクリプトは明示的な許可リスト制です

このサイトも同じ方針で作られています。 レンダリングはブラウザ内のWASMで行われ、何もアップロードされません。CSPはインラインスクリプトを禁止していて(ビルド時に、実際に出力されたスクリプトのsha256だけを許可)、アナリティクスはクッキーを使いません。

報告窓口: SECURITY.mdkengo+shojiku@kengos.jp

ライセンス

コードはApache-2.0 / MIT / BSD 3-Clauseのトリプルライセンスで、使う側がどれかを選べます。同梱フォントは、BIZ UDとNotoファミリがSIL OFL 1.1、IPAmj明朝がIPAフォントライセンスです。各パックにはライセンス全文を同梱していて、フォントを再配布できるかどうかはmanifest.ymlに明記されています。

エンジン(Rust)

仕様・技術スタック

エンジンは、Rustで書かれた17クレートのワークスペースです。テンプレートのパース、CSSライクなボックスモデル、レイアウトツリー、署名と検証を実装しています。PDFの生成にはkrilla、PNGのレンダリングにはtiny-skiaを使っています。

CLI、MCPサーバ、ブラウザWASM、C ABI、N-APIの5つの入口から、同じエンジンを呼び出します。レイアウトとレンダラはクレートで分かれていて、レンダラはレイアウトツリーを描くだけです。この構成のため、どこから呼んでも、同じ入力からは同じバイト列が出ます。

エンジン本体はロケールに依存しません。日付や通貨、単位、和暦の表記はロケールデータから読み込みます。ja-JPとen-USはビルトインで、その他はpacks/locale/のパックです。フォントはpacks/fonts/のパックから読み込みます。

品質ルール

  • 行カバレッジ100%(全ワークスペース)。未達だとCIが落ちます
  • clippy -D warningsとrustfmt
  • 1ファイル300行上限
  • 同梱している例はすべてレンダリングし、コミット済みの出力とバイト単位で比較します
  • CIは、開発者がローカルで実行するのと同じmakeターゲットを実行します。CI専用の定義はありません

デザイナー

仕様・技術スタック

TypeScript + Reactで、スタイリングはTailwind CSSとHeadless UI、ビルドはViteです。エンジンにはWASM経由でアクセスします。

品質ルール

  • Biomeでlintとフォーマット。警告ゼロが条件です
  • TypeScriptのtypecheck
  • 4パッケージすべてでカバレッジ100%
  • 1ファイル実効150行上限(空行とコメントは数えません)