【無人機資安】告別明文 SD 卡:基於 PX4 ULog Streaming 的高強度資料加密方案
在無人機的軟韌體開發中,我們習慣透過 SD 卡中的 .ulg 文件來分析飛行姿態、PID 響應與感測器原始數據(Raw Data)。然而,在國防標案或涉及高商業機密的專案中,這種便利性卻成了最大的資安漏洞。
標準的 PX4 架構是將 Log 以明文(Cleartext) 二進位格式寫入 SD 卡。一旦無人機失事或被捕獲,任何人只需拔下 SD 卡,透過 Flight Review 工具,就能將您的控制參數、任務路徑甚至演算法邏輯一覽無遺。
為了決「數據完整性」與「高強度加密」之間的矛盾,我評估了多種方案,最終採用了 ULog Streaming over MAVLink 的架構。本文將分享這一架構的設計思路,以及如何在量產韌體中實現它。
為什麼不直接加密 SD 卡?
最直覺的想法通常是在飛控(FC)內部寫入 SD 卡前進行加密。但這在工程上存在兩個致命傷:
- 算力不足導致飛行風險: STM32 (即使是 H7) 的主要職責是維持高頻率的姿態控制迴路。AES 等加密運算非常消耗 CPU 週期,若強行在飛控端加密,極易導致 Log 丟失(Dropouts),嚴重時甚至會搶佔控制資源,影響飛行安全。
- 標準 MAVLink 遙測數據不足: 如果只依靠標準的 MAVLink 訊息(如
ATTITUDE),數據通常經過降頻(Down-sampled),缺乏 1kHz 的原始 IMU 數據,無法滿足深度除錯需求。
解決方案:ULog Streaming 架構
我的核心思路是**「職責分離」**:讓飛控專注於產生完整的二進位數據流,而將繁重的加密儲存工作交由算力強大的伴隨電腦(Companion Computer)處理。
系統架構圖

在這個架構下,PX4 的 Logger 模組不再寫入檔案,而是將原始的二進位流封裝在 LOGGING_DATA (ID 266) 訊息中,透過高頻寬介面(USB/Ethernet)傳送出去。這確保了我們能在伴隨電腦端拿到與 SD 卡完全一致、無損的 Raw Data。
量產實戰:韌體層級的強制設定
在原型驗證階段,我們通常會在 SD 卡放入 etc/extras.txt 來修改啟動參數。但在量產階段,為了避免產線操作失誤(例如參數設錯、忘記插卡),最穩健的做法是直接修改 PX4 啟動腳本源碼,將此模式「刻」在韌體裡。
我們修改的目標檔案通常位於 ROMFS/px4fmu_common/init.d/rc.logging。
修改前的標準邏輯
原廠腳本依賴 SDLOG_BACKEND 參數來決定行為,預設通常是寫入檔案:
Bash
# 標準邏輯
if param compare SDLOG_BACKEND 1
then
set LOGGER_ARGS "${LOGGER_ARGS} -m file"
fi
# ... 檢查參數後啟動 ...
修改後的量產邏輯 (Mass Production)
我們移除了對後端參數的檢查,強制指定 logger 行為。這樣做的好處是:即使 QGC 上的參數被誤改,或者沒插 SD 卡,飛控依然會強制輸出數據流,確保任務資料不丟失。
Bash
# 修改後的 rc.logging 片段
# 保留 SDLOG_MODE 判斷 (讓我們仍可透過參數控制是 "開機錄" 還是 "解鎖錄")
if param compare SDLOG_MODE 1
then
set LOGGER_ARGS "${LOGGER_ARGS} -e"
fi
# ... (其他 MODE 判斷保留) ...
# =========================================================
# Mass Production Configuration
# 強制使用 MAVLink Streaming,忽略 SDLOG_BACKEND 參數
# =========================================================
# 1. 強制設定後端為 MAVLink
set LOGGER_ARGS "${LOGGER_ARGS} -m mavlink"
# 2. 強制啟動 Logger 並鎖定 Buffer 大小
# -b 12000 : 設定 12KB Buffer,這對高流量串流至關重要,避免掉包
# -t : 套用上述的 mode 參數 (如 -e)
logger start -b 12000 -t ${LOGGER_ARGS}
結語:安全與效能的平衡
透過這種 「Firmware Enforced Streaming」 的方式,我們達到了三個目的:
- 安全性(Security): 資料落地即加密,無明文暫存。
- 完整性(Fidelity): 保留了由飛控輸出的 100% 原始數據。
- 可靠性(Reliability): 移除了對物理 SD 卡的依賴,並透過韌體寫死配置,杜絕了人為設定錯誤。
在無人機系統整合的深水區,往往不是單一技術的突破,而是對系統架構的精準權衡。希望這篇筆記能對正在處理高機敏專案的工程師們有所啟發。