2015年11月23日 星期一

通話隱私保護: 用 CSipSimple 播打加密的網路電話

如何不被 NSA 監聽? 這個世界上就是有美國 NSA、 中國政府 臺灣黃世銘 等等這樣的偷窺狂喜歡竊聽別人的電話。 (被起訴後, 甚至還可以獲得 未來副總統候選人的律師專業協助!) 所以你需要學會保護自己的通話隱私。 過去貴哥推薦 台灣人發明的反竊聽裝置 JackPair。 不過最近發現不需要買硬體, 直接用你的 android 手機打 sip 電話就可以達到幾乎相同的效果。 跟老婆打了好幾個星期的免費加密電話, 感覺很好。 (嗯?) 在這裡分享一下使用方式及爬文心得。

首先請照著 「自由開放的免費網路電話」 一文, 到 ostel 跟 ekiga 註冊帳號並且用 CSipSimple 這個 app 撥打測試。 理論上在 這一頁 裡面所列出來的任何一個 Hosted VoIP Service 網站註冊所得到的帳號應該都可以拿來打加密電話; 但我只成功地從 ostel.co 的帳號打到 ostel.co 的帳號、 從 ekiga.net 的帳號打到 ekiga.net 的帳號。

在 CSipSimple 裡面填寫 (「新增」) 你的帳號時, 可以盡量從窮舉清單當中挑選你的帳號 provider。 例如在 「world wide providers」 底下可以看到專門用來填寫 ekiga 跟 ostel 帳號的 wizards, 這樣比較容易成功。 如果找不到, 就改用 「generic wizards」 底下的 OSTN。 OSTN Guardian Project 所建立的一系列加密 sip 帳號註冊網站, 理論上會採取比較相近的設定。

[2016/2/28: 若採用窮舉清單的方式設定帳號, 以下會自動設定好, 所以這一段可以省略。 此處保留只為筆記一下。] 從 Settings => Network => Secure Transport 進去,

  1. TLS 要 enable
  2. SRTP mode 平常要選 Optional, 這樣 CSipSimple 會視通話對方的狀況 (有無支援) 而自行調整。 但是打 9196@ostel.co (echo test) 的時候則要選 disabled, 否則會出現 「488 not acceptable here」 的錯誤。
  3. ZRTP mode 要選 Create ZRTP

再來就開始撥號囉 (詳見 「自由開放」 一文的一些測試建議)。

撥話方 1 撥話方 2 撥話方 3
收話方 1 收話方 2 收話方 3

ZRTP 加密跟 JackPair 一樣都採用 Diffie-Hellman 演算法來交換金鑰。 如上圖, 上排是撥號方的截圖; 下排是收話方的截圖。 這裡的重點就是雙方要口頭確認 ZRTP (一種加密協定) 的 SAS (Short Authentication String) 是否一致。 所謂 SAS 是一串短短的亂碼字串 (圖中的 「urnp」 四個英文字母)。 如果雙方看到的亂碼相同, 就表示這次的通話已成功地加密。 此時雙方可以 (可能需要先點開 (三個垂直點的) 選單, 然後才) 點選 「Trust ZRTP Remote」。 於是 ZRTP 後面原本的 「Not Verified」 就會變成 「Verified」, 你們就可以開始安心地講 18 禁的笑話了。 ZRTP 加密跟 JackPair 一樣都採用 Diffie-Hellman 演算法 來交換金鑰, 操作方式也類似。

兩支手機成功加密對話之後, 下次再通話時就不需要再重新確認一次。 前後兩次的 SAS 都會不同; 但同一次通話中, 雙方看到的應該相同。 如果將 CSipSimple 的 app 資料刪掉再重新新增帳號, 就要重新確認一次。

如果你或你通話的對象是 Julian Assange 或達賴喇嘛或李洪志或蔡英文或宋楚瑜等等重要人物, 這才比較有可能發生兩串亂碼字串不同的狀況 -- 這表示有人在進行 中間人攻擊 MitM, 你最好趕快跟竊聽人請安問好告訴他你很乖然後速速掛掉電話。

ZRTP 保護的是通話內容; 至於 「誰何時打給誰講多久」 這類的 「後設資料 (metadata)」 很難完整保護。 圖中 「TLS transport is used for immediate hop」 的訊息顯示你的手機到你的帳號伺服器這一段的後設資訊有受到 TLS 的加密保護。 至於後面就很難講了。

網路電話的加密保護, 真的很安全嗎? 先從技術的角度來說。 如上所述, metadata 的部分很難保障; 但對竊聽者來說, 想取得 sip 電話的 metadata 還是比取得傳統電話的 metadata 要麻煩一些。 至於想要對 ZRTP 進行中間人攻擊、 竊聽通話內容, 這很困難, 而且會被發現 -- 就算竊聽者佔領了你註冊的網站或兩人通話當中的某些路過網站都一樣。 不過, 這篇有趣的文章 Eavesdropping on encrypted VoIP 說: 採用 CELP 編碼 的網路電話 -- 例如 Skype -- 可以被破解, 辨聽成功率高達 50% 到 90%。 但 sip 好像並沒有採用 CELP。 此外, 也看不太出來該文是否適用於 ZRTP 加密過的資料。 不過, 因為語音訊息比文字訊息多了太多冗訊, 因此理論上比較有機會被技術破解。 總之我認為要以技術方式竊聽, 應該非常困難; 但我不是資安專家+語音專家, 所以不敢說不可能 -- 更多進階閱讀請參考 Secure voice communication on Android 「如何 tunnel」 「為何對 sip 加密」 這兩個問答。

從社會運作的角度來說, 最簡單的攻擊方法是用各種藉口直接佔領你的手機。 簡單地說, 大眾沒有意識到自由軟體的重要性, 甚至相信軟硬體大廠 「棄全」 就是 「安全」 的謊言, 不敢 root/越獄/刷機, 所以自己的手機早就棄守了, 這對竊聽者來說, 比採用技術破解要簡單多了。 詳見 「都加密了, 還怕什麼?」 以及 「保護智慧手機安全與隱私的軟體與建議 -- 如何避免被竊聽監聽?」

跟 JackPair 比起來呢? JackPair 是硬體外掛, 所以適用於普通電話號碼或 sip/skype/line/google hangout/xone 等等網路電話。 此外, 因為使用 JackPair 時必須插著耳麥, 所以手機上就算被裝了惡意側錄 app, 應該也無法截取到加密前解密後的語音。 JackPair 還是略勝一籌。 當然, 若用 JackPair 保護通話內容、 同時用 sip 的 TLS 保護 metadata, 甚至再根據 ostn 的建議 採用 Kamailio 或 FreeSwitch 等等軟體自架 sip 伺服器, 那就更安心了。

總之, 如果雙方都採用 OSTN 的 sip 網路電話帳號, 並且採用開放原始碼的 app (例如 f-droid 上面所下載的 CSipSimple) 來打 sip 電話, 手機上也沒有被安裝惡意軟體, 那麼這應該是很能保護隱私、 目前 (貴哥) 已知僅次於 JackPair 的最安全通話方式。 但如果談話當中談到真正重要的關鍵訊息 -- 例如重要的密碼 -- 我會把這一小段文字資訊改用 xmpp + otr 加密簡訊來傳遞, 安全度更會高於加密的語音通話。

1 則留言:

  1. 補上 Secure Transport 相關設定。 取消 SRTP 之後, ostel 的 echo test (9196) 終於就通了!

    回覆刪除