Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
linux-fingerprint-r503 — Grow R503 センサー + Arduino + Rust 製 fprintd 置き換えデーモンを使った Linux デスクトップ指紋ログイン | Kitploit
ツール/GitHubGitHub/matpb/linux-fingerprint-r503
組み込みシステムセキュリティ暗号化ペネトレーションテストハードウェアセキュリティ認証レッドチーミング
GitHubmatpb/linux-fingerprint-r503

linux-fingerprint-r503

Grow R503 センサー + Arduino + Rust 製 fprintd 置き換えデーモンを使った Linux デスクトップ指紋ログイン

リポジトリを見る
44232ヶ月前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

linux-fingerprint-r503 — Grow R503 + Arduino を使用した Linux 向け指紋ログイン

CI r503d firmware Rust 2024 Platform: Linux License: MIT

部品から組み立てる Linux デスクトップ向け USB 指紋リーダーです。部品の合計コストは 15 ドル未満。アップストリームの fprintd のドロップイン代替品で、PAM、KDE 設定、GNOME 設定、fprintd-verify、指での sudo、指での画面ロック解除がすべて動作します。

fw=1.0 / r503d 1.0.0 の時点で、Arduino↔ホスト間の配線は認証されます。すべてのコマンドとレスポンスには、EEPROM 内の TOFU ペアリング済みシークレットを鍵とする SipHash-2-4 MAC が付与されます。USB シリアルリンクに対するリプレイ攻撃とホットスワップ攻撃はブロックされます。脅威モデルがカバーしない内容を含む完全な設計については、SPEC.md §13 を参照してください。

手作り木製エンクロージャーに取り付けられた R503 センサー、青いリングが光っている

3Dプリンターがあればなあ…``` ┌──────────┐ UART ┌─────────────┐ USB-CDC ┌──────────────────┐ │ Grow │ 57600 8N1│ Arduino │ /dev/r503 │ r503d daemon │ │ R503 │◀─────────▶│ (firmware) │◀──────────▶│ net.reactivated │ │ sensor │ 3.3V TTL │ │ framed, │ .Fprint on D-Bus│ └──────────┘ └─────────────┘ MAC'd └──────────────────┘ │ ▼ PAM, KDE, GNOME, fprintd-verify, …

root@kitploit:~
## なぜ

Linux向けのハードウェアUSB指紋リーダーは希少で高価であり、既存のもの(Validity、Synapticsなど)は、ベンダーのファームウェア更新で壊れる不安定なlibfprintドライバーを通じてリバースエンジニアリングされています。Grow R503のプロトコルは**公開**されており、Arduino側は自作のコードで、libfprint互換レイヤーは単なるD-Busです。

さらに、ソースを上から下まで読める指紋リーダーが手に入ります。

## 部品リスト

| 部品 | メモ | 参考価格 |
|------|-------|------|
| Grow R503 静電容量式指紋センサー | RGBリング付きの丸型 | 約$10 |
| Arduino Uno R3 / Nano / Mega / 任意のATmega328ボード | SoftwareSerialが動作するもの | $5–$25 |
| ジャンパーワイヤー4〜6本 | Dupont / ブレッドボード | 些細なもの |

これだけです。**レベルシフターも分圧器も不要** — その理由は [`SPEC.md` §3.1](https://github.com/matpb/linux-fingerprint-r503/blob/main/SPEC.md) を参照(R503のRXラインは実際には5Vトレラントで、データシートは嘘をついています)。```
R503             Arduino (Uno R3 / Nano / etc.)
----             ------------------------------
Red (VCC)        3V3
White (3.3VT)    3V3                  (touch-IC supply; shares rail with red)
Black (GND)      GND
Yellow (TXD)     D2  ── SoftwareSerial RX
Brown (RXD)      D3  ── SoftwareSerial TX   (direct — no divider!)
Blue (WAKEUP)    D4                          (optional; not used by firmware yet)

If your R503 ships with the JST-SH connector, snip a 6-pin JST-SH-to-Dupont pigtail to break the wires out. Brown is sometimes green depending on the seller — verify against the wire that goes into the RXD pin of the JST header, not the colour.

前提条件

Fedora 44 KDEでテスト済み。fprintd、pam_fprintd、および最新のRustツールチェーンを備えたsystemdベースのディストリビューションであれば動作するはずです。

システムパッケージ:

ディストリビューションビルドランタイム
Fedora / RHELrust cargo arduino-cli tpm2-tss-develfprintd pam fprintd-pam tpm2-tss
Debian / Ubunturustc cargo arduino-cli libtss2-devfprintd libpam-fprintd libtss2-esys-3.0.2-0

tss-esapiパッケージは、--pair --seal-tpm(SPEC §13.12)を使用する予定がある場合にのみ必要です。それ以外の場合、デーモンはTPMなしでもビルドおよび実行できます。tss-esapiはビルド時の必須依存関係ですが、実行時の任意依存関係です(コードパスは/var/lib/r503d/key.tpmが存在する場合にのみ実行されます)。

Rust 1.95+、arduino-cliが$PATHに含まれていること。

TPM2はありますか?```bash ls /dev/tpmrm0 && tpm2_pcrread sha256:7 | head -3

root@kitploit:~
両方が成功した場合、ホストはシールドキーパスを使用できます。`/dev/tpmrm0` が
ない場合 (古いハードウェア、BIOSでTPMが無効、または仮想TPMを持たないVM)、
デフォルトの平文キーフローを使用してください。

## ビルドとインストール

### 1. ファームウェアを書き込む

Arduino IDE で `firmware/r503fp/r503fp.ino` を開き、アップロードします。または
`arduino-cli` を使う:```bash
# Uno R3:
arduino-cli compile --fqbn arduino:avr:uno firmware/r503fp/
arduino-cli upload  --fqbn arduino:avr:uno --port /dev/ttyACM0 firmware/r503fp/

# Nano (modern Optiboot, including most Elegoo / WAVGAT clones):
arduino-cli compile --fqbn arduino:avr:nano:cpu=atmega328 firmware/r503fp/
arduino-cli upload  --fqbn arduino:avr:nano:cpu=atmega328 --port /dev/ttyUSB0 firmware/r503fp/

# Nano with legacy 57600-baud bootloader (older clones):
#   replace `cpu=atmega328` with `cpu=atmega328old`

ファームウェアは Adafruit_Fingerprint を使用します。IDE はそれをインストールする よう初回コンパイル時に提案します。

arduino-cli upload が not in sync: resp=0x7e で失敗した場合、ブートローダーは もう一方のバリアントです — atmega328 ↔ atmega328old を入れ替えて再試行してください。両方 動作します。違いはブートローダーのボーレートだけです。

2. デーモンをビルドする

Rust 1.95+ が必要です。```bash cd pcside/daemon cargo build --release

root@kitploit:~
### 3. インストール```bash
sudo bash pcside/daemon/dist/install.sh

そのスクリプト:

  • target/release/r503d を /usr/local/bin/r503d にインストールします
  • /var/lib/r503d/(モード 0700 root:root)を鍵、状態、および ユーザースロットレジストリ用に作成します
  • Arduino を /dev/r503 として公開する udev ルールを書き込み、デバイスノードを root:root 0600 にロックします(root として実行されているデーモンだけがそれを必要とします; これによりデフォルトの 0660 root:dialout パスが閉じられ、他のローカルユーザーが ポートを開けなくなります — セキュリティ監査 2026-05-28 / H1)。結果: インストール後、 /dev/r503 に対する手動の arduino-cli/serial-monitor コマンドには sudo が必要です。
  • systemd ユニット(/etc/systemd/system/r503d.service)をインストールします
  • net.reactivated.Fprint の D-Bus 自動起動エントリをオーバーライドします
  • polkit アクションをインストールします (/usr/share/polkit-1/actions/net.reactivated.fprint.device.r503d.policy) これは呼び出し元識別ゲートによって使用されます

これは冪等です — cargo build --release のたびに再実行して、 新しいバイナリを再デプロイします。

4. Nano をデーモンとペアリングする

書き込み直後の Nano はペアリングされていません — デーモンは通信しようとしますが、 ファームウェアはすべてのフレーム化コマンドを拒否します。以下の2つのフローの いずれかを選択してください; どちらもペアリング済みの Nano と動作するデーモンで終わります。 ホストに TPM2 がある場合(簡単な確認方法は前提条件を参照)は、TPM でシールドされた フローが推奨されます。

両方のフローで使用されるオプトインファイル(/etc/r503d/allow-pair)は、 自分の Nano を持ってあなたの机に駆け寄る攻撃者を阻止するために存在します — root なしでのペアリングは不可能です。r503d --pair は、Nano に鍵を送信する 前にマーカーを削除します: ホストが Nano 側のコミットとホスト側の永続化の間に クラッシュした場合、ゲートは既に閉じているため、次のペアリング試行には 管理者がマーカーを再度 touch する必要があります。送信前の早期終了 (マーカーがない、または「すでにペアリング済み」)は、再試行のためにマーカーをそのまま残します。

4a. 平文鍵ペアリング(デフォルト)

TPM2 デバイスがない場合、またはオフラインディスク攻撃への耐性が必要ない場合は、 これを使用します。```bash sudo systemctl stop r503d sudo mkdir -p /etc/r503d sudo touch /etc/r503d/allow-pair # opt-in (see SPEC §13.5) sudo r503d --pair # 128-bit key → /var/lib/r503d/key sudo systemctl start r503d

root@kitploit:~
I notice you've provided instructions but the actual content to translate appears to be missing after "INPUT:".

Could you please provide the chunk content you'd like me to translate? I'm ready to translate it to Japanese (ja) following your rules once the source text is provided.```bash
sudo r503d --status
# port:             /dev/r503
# firmware:         fw=1.1 fmt=2
# firmware paired:  true
# firmware counter: 42
# host key.tpm:     (absent)
# host key:         /var/lib/r503d/key
# host key.bak:     /var/lib/r503d/key.bak
# tpm device:       (absent)
# allow-pair:       (absent)

4b. TPMシールペアリング(TPM2ホストで推奨、SPEC §13.12)

同じフローで、--seal-tpm を追加します。生成された鍵は PCR7 (Secure Bootポリシー + 鍵)にシールされ、平文の key ファイルの代わりに /var/lib/r503d/key.tpm に書き込まれます。オフラインディスク攻撃者( アンマウントされたパーティションの dd、敵対ホストへのSSDの差し替え)が取得できるのは暗号文のみです。```bash sudo systemctl stop r503d sudo mkdir -p /etc/r503d sudo touch /etc/r503d/allow-pair sudo r503d --pair --seal-tpm # seals new key to current PCR7 sudo systemctl start r503d

root@kitploit:~
INPUTに翻訳対象のコンテンツが含まれていません。翻訳するテキストが提供されていないため、このチャンクの翻訳を実行できません。正しい「INPUT:」セクションを再送信してください。```bash
sudo r503d --status
# port:             /dev/r503
# firmware:         fw=1.1 fmt=2
# firmware paired:  true
# firmware counter: 12
# host key.tpm:     /var/lib/r503d/key.tpm
# host key:         (missing)
# host key.bak:     (missing)
# tpm device:       /dev/tpmrm0
# allow-pair:       (absent)

カーネル更新、initrd 更新、fwupd UEFI ファームウェア更新、および grub2 更新は PCR7 を変更しないため、再シールは不要です。PCR7 が変化するのは、 セキュアブートポリシーの編集、MOK の登録、またはディスクを別のホストに 移動した場合のみです。その時点でデーモンは TPM_RC_POLICY_FAIL で 起動を拒否し、dist/reseal-tpm.sh が約 90 秒で復旧します。 復旧: PCR7 変更 を参照してください。

5. 登録と検証```bash

Enroll a finger (use KDE Settings → Users → Fingerprint Auth for a GUI):

fprintd-enroll mat

Verify:

fprintd-verify mat

sudo with finger:

sudo whoami

root@kitploit:~
KDE Settings(Plasma 6)とGNOME Control Centerのユーザーアカウント指紋ダイアログは、どちらも上流の`fprintd`を操作するのとまったく同じように`r503d`を操作します。

### 再ペアリング / 鍵のローテーション

新しい鍵を必要とする場合(鍵の漏洩、ハードウェア交換の予定、パラノイア):```bash
sudo systemctl stop r503d
sudo r503d --unpair                        # framed; wipes Nano EEPROM + host key
sudo touch /etc/r503d/allow-pair
sudo r503d --pair                          # plaintext-key rotation
#  - or -
sudo r503d --pair --seal-tpm               # TPM-sealed rotation
sudo systemctl start r503d

元のペアリングパスに合わせてください。 元々 --seal-tpm を使用していた場合は、--seal-tpm でローテーションしてください — そうしないと、ローテーションは黙ってディスク上の平文キーにダウングレードされます。

復旧: PCR7 が変更され、再シールが必要

--pair --seal-tpm を使用し、その後 PCR7 が測定する何かを変更した場合(Secure Boot の無効化/有効化、新しい MOK の登録、ディスクの別マシンへの移設など)、デーモンは TPM_RC_POLICY_FAIL に関するジャーナルメッセージとともに起動を拒否します。復旧は次の1コマンドです:```bash sudo bash pcside/daemon/dist/reseal-tpm.sh

root@kitploit:~
このスクリプトは`r503d`を停止し、`firmware/r503fp_wipe/`を再フラッシュしてNano EEPROMを消去し、メインファームウェアを再フラッシュして、`/etc/r503d/allow-pair`を作成し、`r503d --reseal-tpm`を実行して*現在の*PCR7にシールされた新しい鍵を生成し、デーモンを再起動します。実時間:約90秒。登録済みの指紋は保持されます — テンプレートはR503センサーのフラッシュに保存されており、Nanoには保存されません。

スクリプトでは`arduino-cli`が利用可能である必要があります。ユーザーの`$HOME/.local/bin`にインストールされている場合、`$SUDO_USER`経由で自動検出されます。それ以外の場合は、実行前に`ARDUINO_CLI=/full/path/to/arduino-cli`を設定してください。

### 復旧:`state.json`の紛失(カウンターのデシンク)

ホスト鍵が無傷でも`/var/lib/r503d/state.json`が消失しているか、ロールバックされている場合(古いバックアップを復元した、誤ってrmした)、デーモンのカウンターがNanoの`last_seen`より遅れ、フレーム化されたすべてのコマンドが`ERR replay`ではじかれます。`r503d --status`でこの状態が示されます。修正は1つのコマンドだけです:```bash
sudo systemctl stop r503d
sudo r503d --resync                         # reads Nano last_seen, sets host counter to last_seen+1
sudo systemctl start r503d

再ペアリングも再フラッシュも不要 — 鍵は決して移動しません。--resync が依存する status クエリは 認証されていませんが、ホストカウンターを 前方 にしか進めず、 Nano がすでにコミットした内容に一致させるだけです。したがって、古いフレームを 再生可能にすることは決してできません(最悪の場合、嘘をつく MITM が別の ERR replay を強制しますが、 これは、フレームを改ざんすることで既に可能でした)。 SPEC.md §13.11 を参照してください。

復旧: ホストキーを完全に失った場合

認証された --unpair は、承認のために鍵を必要とします。ディスク上のすべての コピーが失われた場合(ディスククラッシュ、誤った rm、key と key.bak の両方が削除された、または key.tpm ブロブが失われた)、reflash-to-wipe エスケープ ハッチが必要です — dist/reseal-tpm.sh が上記の PCR7 変更ケースで 自動化するのと同じ手順です:```bash sudo systemctl stop r503d

/dev/r503 is root:root 0600 since install (audit H1), so the uploads need root.

sudo arduino-cli upload --fqbn arduino:avr:nano:cpu=atmega328 --port /dev/r503 firmware/r503fp_wipe/

Wait ~1s for the wipe to complete (LED starts blinking — that's the wipe sketch).

sudo arduino-cli upload --fqbn arduino:avr:nano:cpu=atmega328 --port /dev/r503 firmware/r503fp/ sudo touch /etc/r503d/allow-pair sudo r503d --pair sudo systemctl start r503d

root@kitploit:~
`sudo arduino-cli` が command-not-found と表示される場合(arduino-cli は `~/.local/bin` にあり、root の `PATH` には含まれていません)、`sudo env "PATH=$PATH" arduino-cli …` のように実行するか、絶対パスを指定してください。

これは攻撃者が利用できるバックドアではありません。再ペアリングにはホスト側での root 権限が必要であり(オプトインファイルと `--pair` CLI の両方に root が必要)、そのため、あなたがすでに root でない限り、書き換えられた Nano を信頼対象にすることはできません。

### アンインストール```bash
sudo bash pcside/daemon/dist/uninstall.sh

すべてを元に戻し、fprintd のマスクを解除し、/var/lib/r503d/(キー、 状態、ユーザー)を後で再インストールしたい場合に備えてそのまま残します。その後、 本当にクリーンな状態にしたい場合は、そのディレクトリを手動で削除してください。

仕組み

Arduino は小さな ASCII プロトコルファームウェア(firmware/r503fp/)を実行し、 UART 側では R503 独自の R30x("Sync Word")バイナリプロトコルを話し、 USB-CDC 経由でホストと行指向のテキストコマンドを交換します: ping、info、enroll N、verify、delete N、clear、 led off。完全な v1 プロトコルは SPEC.md §5 にあります。

fw=1.0(v2 認証チャネル作業のマイルストーン E)以降、すべての コマンドとレスポンスは C <counter> <body> M <mac> / R <counter> <seq> <body> M <mac> フレームでラップされ、TOFU でペアリングされた 128 ビットキーによる SipHash-2-4 で MAC 化されます。Nano は EEPROM にウェアレベリングされた 単調増加カウンタを保持し、デーモンは /var/lib/r503d/state.json に対応するカウンタを保持します。 リプレイ試行(ファームウェア側の incoming <= last_seen)は ERR replay として拒否され、改ざんされたフレームは ERR mac_invalid になります。完全な仕様、脅威 モデル、既知の制限事項は SPEC.md §13 にあります。

レイアウト:``` firmware/r503fp/ Arduino firmware (v2 framed ASCII protocol) firmware/r503fp_wipe/ Emergency one-shot EEPROM wipe (lost-key recovery) firmware/* Diagnostic / development sketches (ping, loopback, ...) pcside/daemon/ Rust daemon (the fprintd replacement) pcside/daemon/src/{crypto,framing,keystore,state,pairing}.rs v2 wire protocol implementation pcside/daemon/src/auth.rs caller-identity gating for D-Bus methods pcside/daemon/dist/ udev rule, systemd unit, polkit + bus policy, install scripts docs/ Decision logs + troubleshooting SPEC.md Full architecture + protocol spec (§13 = v2 auth)

root@kitploit:~
## セキュリティモデル — 概要

ワイヤーレベルの認証が対象とする脅威は、
**「5分と予備のNanoを持った邪悪なメイド」** と、`/dev/r503` 上の悪意あるローカルプロセスの組み合わせです。
国家レベルの攻撃者や、ラボを持つハードウェア攻撃者は対象外です。シングルユーザーのデスクトップ展開を想定し、スコープ外リストを文書化しています。
完全な脅威モデルは [`SPEC.md` §13.1](https://github.com/matpb/linux-fingerprint-r503/blob/main/SPEC.md) にあり、実装・レビューの証跡は
[`docs/REVIEW-2026-05-28.md`](https://github.com/matpb/linux-fingerprint-r503/blob/main/docs/REVIEW-2026-05-28.md) にあります。別途実施した
敵対的権限昇格監査(2026-05-28)と、その主張ごとの検証・是正パスは
[`docs/SECURITY-AUDIT-2026-05-28.html`](https://github.com/matpb/linux-fingerprint-r503/blob/main/docs/SECURITY-AUDIT-2026-05-28.html)
および
[`docs/SECURITY-AUDIT-2026-05-28-VALIDATION.html`](https://github.com/matpb/linux-fingerprint-r503/blob/main/docs/SECURITY-AUDIT-2026-05-28-VALIDATION.html)
にあります。

**防御対象:**
- Nanoの悪意あるユニットへのホットスワップ(鍵がない → すべてのフレームがMAC検証に失敗)。
- `/dev/r503` に偽のマッチ応答を注入するローカルプロセス。2層で防御:
  デバイスノードは `root:root 0600`(udevルール)で、デーモンは `TIOCEXCL` で保持するため、
  非rootプロセスはオープンできません。たとえオープンできたとしても鍵がないため、フレームはMAC検証に失敗します。
- 将来のセッションで記録された `OK match=...` フレームのリプレイ。
- 任意のフレームフィールドへのビット反転改ざん(定数時間MAC比較)。
- カウンタ枯渇による破壊: `--resync` 中のワンショットMITMやピアが単調カウンタを `u64::MAX` まで進め、
  チャネルを恒久的に不能にする攻撃は、両端で強制される予約済みカウンタ上限(`fw=1.1+`; SPEC §13.4 / 2026-05-28監査 DoS-2)で阻止されます。
- ローカルユーザーによるセンサーへのDoS: 単一のキャプチャスロットゲートが進行中のエンロール/検証処理を制限し、
  削除パスはアクションゲート付きのため、`Start`/`Stop`(または同時削除)の flood で認証を妨害できません。
- ローカルの非rootユーザーによるクロスユーザー指紋の登録・消去・列挙
  (例: `mallory` が `Claim "root"` を呼び出して自分の指を登録する)— `username` を取るすべてのD-Busメソッドで
  呼び出し元の身元を確認し、システムバスポリシーはブローカー層で非 `wheel` 呼び出し元を拒否します。
- **`--seal-tpm` と併用した場合のホスト鍵へのオフライン・ディスク攻撃**:
  ディスク上の鍵はPCR7にTPM2シールされているため、アンマウントされたパーティションの `dd` や、
  敵対的ホストへのSSDの差し替えでは暗号文しか得られません。
  同じマシン、同じSecure Bootポリシーの下でのみアンシールされます。
  [SPEC §13.12](https://github.com/matpb/linux-fingerprint-r503/blob/main/SPEC.md) を参照。

**防御対象外:**
- ホストのroot権限侵害(鍵は `/var/lib/r503d/key` にあり、`0600 root:root`)。
  稼働中のホストのrootはTPMシール版の鍵もアンシールできます — シールは *オフライン* 攻撃を鈍らせるだけで、オンライン攻撃は防ぎません。
- Nanoへの物理攻撃(ISPによるEEPROM読み出し約30秒、チップのデキャップ等)。
- ファームウェア再書き込み攻撃(Arduinoブートローダーは署名なし — ただし再ペアリングにはホストのroot権限が必要なため、
  ホストが侵害されない限り、再書き込みされたNanoを信頼状態に持ち込むことはできません)。
- R503側の侵害(R30xプロトコルには認証が一切なく、スコープ外)。
- **暗号ポスチャ。** SipHash-2-4 MAC、128ビット共有鍵、64ビットMAC出力、ドメイン分離されたMAC入力。
  2つの独立した実装(AVR上の手書きC++で起動時KAT自己テスト付き、ホスト上の手書きRustでCIで1024のランダムベクトルに対し
  サードパーティ製 `siphasher` クレートとビット単位で相互検証)。ホストのMAC比較は
  `subtle::ConstantTimeEq` を使用。ワイヤーパーサーはCI実行ごとにプロパティファジング(約135,000入力)。
  `cargo audit` クリーン。SipHash鍵は `zeroize::Zeroizing<...>` でラップされ、ドロップ時に消去されます
  (フレームごとのMAC入力バッファも同様)。`cargo fuzz`
  libFuzzerターゲットは `pcside/daemon/fuzz/` に同梱され、nightlyでの長期コーパス実行に対応。
  有料の第三者による人による監査は未実施 — それがあれば有用です。PR歓迎。

根拠付きの完全な脅威モデル: [`SPEC.md` §13.1](https://github.com/matpb/linux-fingerprint-r503/blob/main/SPEC.md)。

## 制限事項

- **マルチユーザーは機能しますが、`wheel` メンバーのみ対象です。** 呼び出し元の身元は
  `username` を取るすべてのD-Busメソッド(`Claim`、`EnrollStart`、`VerifyStart`、`ListEnrolledFingers`、
  `DeleteEnrolledFingers`)で確認され、自己リクエストと `uid 0`(PAM)は黙って成功し、
  非root呼び出し元からのクロスユーザー操作は `net.reactivated.Fprint.Error.PermissionDenied` で拒否されます。
  システムバスポリシーは、会話を開始できるアカウントをさらに制限します:
  `root` と `wheel` メンバーのみがデーモンに到達でき、それ以外はブローカー層で
  `org.freedesktop.DBus.Error.AccessDenied` を受け取ります。
  クロスユーザーのエンロールが必要ですか? rootになります: `sudo fprintd-enroll target-user`。
  キオスク/マルチユーザーラボ向けにクロスユーザーゲートを緩めたいですか?
  `/etc/polkit-1/rules.d/` にJSルールを置き、
  [`net.reactivated.fprint.device.setusername`](https://gitlab.freedesktop.org/libfprint/fprintd/-/blob/master/src/net.reactivated.fprint.device.policy.in)
  を対象にしてください — アクション名は上流のfprintdと完全に同じです。
- **リーダーは1つ。** デーモンはD-Bus上に単一のDeviceオブジェクトを公開します。
  複数リーダー構成にはManagerの拡張が必要です。
- **`finger-present` / `finger-needed` ヒントプロパティの `PropertiesChanged` 発行なし。**
  一般的なfprintdクライアント(PAM、KDE設定、GNOME)はすべて、ポーリング型のヒントではなく
  `EnrollStatus` / `VerifyStatus` シグナル(発行されます)で動作します — しかし
  `Get + PropertiesChanged` を行う厳密なクライアントは古い値を見ることになります。
- **単一Nano = 単一障害点。** Nanoが死ぬと、予備を再フラッシュして再ペアリングするまで指紋ログインは使えません。
  パスワード認証をバックアップとして有効にしておいてください。
- **State.jsonの喪失は1コマンドで復旧可能。** ファームウェアがまだ高い `last_seen` を持っている間に `state.json` が失われると、
  デーモンは最初の送信で `ERR replay` に達します。`sudo r503d --resync` を実行してNanoのカウンタを読み取り、
  ホストを再調整してください — 再ペアリングは不要です。[`SPEC.md` §13.11](https://github.com/matpb/linux-fingerprint-r503/blob/main/SPEC.md) を参照。

## トラブルシューティング```bash
# Daemon logs:
sudo journalctl -u r503d.service -f

# Confirm the sensor enumerates correctly:
ls -l /dev/r503
busctl --system call net.reactivated.Fprint /net/reactivated/Fprint/Device/0 \
    net.reactivated.Fprint.Device ListEnrolledFingers s ""

# Confirm fprintd is masked and r503d owns the bus name:
systemctl is-enabled fprintd  # should print "masked"
busctl --system list | grep -i fprint

デーモンが起動しない、またはセンサーが応答しない場合、最も一般的な 修正方法は配線です — SPEC.md §3を参照してください。特に "分圧器なし" の注記が§3.1にあります。より詳細なランブックは docs/TROUBLESHOOTING.md にあります。

ライセンス

MIT — LICENSE を参照してください。

クレジット

  • Adafruit_Fingerprint — Arduino側のR30xプロトコル実装。
  • zbus, serialport-rs, tokio — Rust の D-Bus / シリアル / 非同期スタック。
  • fprintd プロジェクト — クリーンなD-Busインターフェースの設計に対して。 このデーモンは libfprint のソースを一切読むことなく そのインターフェースを実装できた。
ツールをダウンロード
  • 制限的なシステムバスポリシーをインストールします (/etc/dbus-1/system.d/net.reactivated.Fprint.conf)— root と wheel メンバーのみが デーモンと通信できます; それ以外の全員は、ブローカーで AccessDenied になり、 デーモンが呼び出しを確認する前に拒否されます
  • アップストリームの fprintd.service を停止してマスクします
  • r503d.service を起動します