NodeDB 是什麼?它在 Meshtastic 中扮演什麼角色?
要理解節點污染攻擊,必須先知道 NodeDB 是什麼。NodeDB(Node Database)是每台 Meshtastic 裝置在本地端維護的一份「通訊錄」,記錄它所看過的所有鄰近節點資訊。
NodeDB 儲存哪些資料?
每當裝置收到某個節點廣播的 NodeInfo 封包,就會把該節點的完整資訊存入 NodeDB:
NodeDB 在裝置運作中的四個核心功能
NodeDB 的生命週期:節點記錄如何進出
NodeDB 的容量有限,記錄不斷地被新增、更新、淘汰,這個循環正是節點污染攻擊得以運作的關鍵:
淘汰的判斷依據:三層優先序
NodeDB 滿時並非隨機踢人,韌體依照固定優先序掃描所有記錄,找出「最應該被淘汰的那一筆」:
Meshtastic 有兩份 NodeDB,分別在不同地方,扮演不同的防護角色:
- 執行時由 Flash 載入 RAM 操作,上限約 100 筆(受 RAM 容量限制,依 MCU 而異)
- 定期或關機時批次寫入 Flash 持久化(收到封包不立刻寫 Flash)
- 重開機後從 Flash 還原(非揮發性)
- Favorite 節點永不淘汰
- NodeDB 滿時自動依三層優先序淘汰記錄
- 這是節點污染攻擊的目標
- 儲存於手機應用程式內
- 無筆數限制,可記錄所有看過的節點
- 不會因為裝置端淘汰而消失
- 公鑰變更時顯示紅色警示
- 提供額外一層身份驗證防護
- 是目前最強的防污染偵測機制
節點污染的三個肇因
節點污染並非單一漏洞造成,而是三個設計特性同時成立時才會發生。理解這三點,是掌握防禦策略的前提。
① Trust on First Use(ToFU):信任首次見面
Meshtastic 是去中心化網路,沒有中央身份認證伺服器。節點第一次收到某個對端的 NodeInfo 封包時,直接信任其內容並存入本地節點資料庫(NodeDB)。這個設計讓網路能夠自動擴展,但也意味著任何人都可以聲稱自己是任何節點。
② NodeDB 記憶體上限約 100 筆
嵌入式裝置的 RAM 有限,NodeDB 能同時記錄的節點數因 MCU 而異(一般約 80~100 筆)。當有新節點加入且 NodeDB 已滿,最舊的節點記錄會被淘汰。一旦某個節點被淘汰,下次收到「聲稱是它」的封包,就等同初次見面,會再次被無條件信任。
③ 攻擊者持有頻道 PSK
PSK(Pre-Shared Key)是頻道的共用加密鑰匙。持有 PSK 的人可以解密頻道上所有封包,也可以製造出格式完全合法的假封包。公開頻道的 PSK 人人可得,Default Channel(LongFast)的 PSK 值甚至直接寫在 Meshtastic 公開原始碼中。
攻擊的完整流程
節點污染攻擊的技術門檻遠低於一般預期——攻擊者只需要一台 Meshtastic 裝置(或能廣播 LoRa 封包的工具)以及頻道 PSK,便可執行以下步驟:
蒐集成員 Node Number
100+ 個假節點
被踢出 NodeDB
NodeInfo 封包
至所有成員裝置
偽造封包的內容比較
以下展示合法 NodeInfo 封包與攻擊者偽造封包的對比。兩者的格式完全相同,接收方裝置在沒有簽名驗證的情況下無從辨別。
污染過程的完整圖解
以下五張圖依序呈現從正常狀態到污染完成的每個關鍵階段,綠色代表正常節點、紅色代表遭污染或假冒、藍色代表 Favorite 受保護節點。
PSK 加密的本質:不是你想的「保密」
很多使用者誤以為「有加密就安全」,但 Meshtastic 頻道的 PSK 加密,設計目的是頻道隔離,而非內容隱私保護。
| 加密類型 | 誰能讀取內容 | 誰能偽造封包 | 適用目的 |
|---|---|---|---|
Default ChannelPSK = 0x01(公開) |
全世界任何人 | 全世界任何人 | 公開廣播 |
自訂私有頻道自訂 PSK |
所有持有 PSK 的成員 | 所有持有 PSK 的成員 | 頻道隔離 |
私訊 DM非對稱加密 |
僅目標接收方 | 理論上不可能(需私鑰) | 端對端加密 |
NodeInfo 各欄位的保護狀態
影響範圍:能做什麼、做不到什麼
節點污染攻擊並非萬能。清楚了解攻擊的邊界,有助於正確評估風險等級。
節點污染攻擊的過程及影響
節點污染攻擊從發動到完成,每個階段都會產生不同的影響。有些影響在攻擊「進行中」就已發生,不需要等污染成功——嚴重程度完全取決於使用場景——點選各路徑查看詳細說明。
攻擊者把信任節點(群組管理員、協調者)的名字改成自己控制的內容,再以那個身份在頻道上發出指令。因為顯示名稱看起來是那個人,成員很可能照做。
NodeInfo 裡的 GPS 座標同樣可被偽造。攻擊者把固定基礎節點或骨幹中繼節點的位置移到幾十公里外,Mesh 路由演算法對網路拓撲的認知就會出錯。
LoRa 頻道是共用的公共資源
LoRa 頻段是無線電頻譜的一部分,屬於區域內所有人共用的通訊資源(無線電公地)。它不像私人網路可以設門禁——任何持有相容硬體的人都能在同一段頻率上廣播。攻擊者密集佔用頻道,等同於封鎖了一條公共道路:不論其他人有沒有被「污染」,他們都失去了使用這條路的機會。改變名字影響的是資訊的真實性;佔用頻道剝奪的是所有人通訊的權利。
正常情況下公鑰受 NodeDB 保護不可覆蓋。但有一個邊界情況:攻擊者的偽造封包在目標節點「第一次被看見」之前就送達,公鑰寫入就可以成功。
App 端的公鑰警示是最後一道防線,但使用者在看到紅色警告後的直覺反應,往往反而讓污染固化。
嚴重程度:依使用場景而異
污染後如何恢復?
- 自身節點名稱被改 → 重開機即恢復正確資訊
- 他人節點顯示假名 → 等對方裝置重新廣播正確 NodeInfo
- 重開機後韌體會重新廣播自身的正確 NodeInfo,鄰近節點會更新記錄
- 在 App 中刪除該節點記錄
- 透過帶外管道確認對方身份後,請對方重新廣播
- 公鑰邊界情況需面對面重新掃 QR Code 才能完全修復
- 刪除前務必先確認哪份記錄才是真實的
現在就能做的防禦措施
以下四種方法可以立即執行,大幅降低被節點污染攻擊影響的機率。
根本解法:訊息簽名(Message Signing)
官方正在推進的 Message Signing 機制,是從根本上解決節點污染問題的方向。原理是:每個 NodeInfo 封包附上發送方私鑰的數位簽名,任何收到封包的節點都可用公鑰驗簽——假封包因缺乏私鑰,驗簽失敗後直接被韌體丟棄。
三種演算法的比較
對訊息長度的影響(UTF-8 編碼)
加入 Ed25519 簽名(64 bytes)後,訊息有效空間從 200 bytes 縮減至 136 bytes。對中文使用者的影響:
建議的實作策略
考量硬體資源與使用體驗,官方可能採用分階段導入:
| 階段 | 對象 | 理由 | 狀態 |
|---|---|---|---|
| 第一階段 | NodeInfo 封包 | 空間充裕(payload 約 80–120b),效益最高 | 進行中 |
| 第二階段 | 一般訊息(可選) | 由頻道設定決定是否啟用,兼顧使用體驗 | 規劃中 |
| 長期 | 所有封包類型 | 包含位置封包、Admin 封包等 | 待定 |
總結:風險評估與行動清單
節點污染是 Mesh 網路去中心化設計下的結構性限制,並非個別實作的疏失。了解它的邊界(能做什麼、不能做什麼),比過度擔心更有建設性。
硬體加密支援程度對簽名效能的影響:不同平台的 Ed25519 簽名速度差異顯著。純軟體實作(如 nRF52840)約需 10–30 ms,在 LoRa 秒級封包週期內可接受,但 CPU 全程佔用;大數運算輔助(如 ESP32-S3 的 MPI 加速器)實際加速效果有限,視函式庫不同約需 30–100 ms;真正的 ECC 硬體加速(如 nRF54L15 的 CRACEN、ESP32-C6 的 ECC 周邊)可將簽名壓縮至 1–15 ms 且幾乎不佔用 CPU,並可提供私鑰硬體隔離保護。硬體支援程度越高,簽名機制對裝置效能與電池壽命的影響就越小。