使用錢包的安全檢查要點 - 以 KryptoGO Wallet 為例

imgare-cover

在上一篇文章的時候我們解釋了助記詞之於 Web3 的重要性,而我們的助記詞一定會需要放到錢包中,這時候錢包的安全性就非常關鍵了。

Web 3 時代必備的金融資安常識:助記詞/私鑰/錢包(帳號) — KryptoGO

與銀行不同,區塊鏈沒有像銀行全範圍的反欺詐偵測系統,出問題也沒有辦法有立刻幫忙撤銷或恢復交易的客戶支援。比起同樣在手機上的銀行 APP,加密錢包的應用安全一旦出問題,資金更容易被快速竊取轉出。

加密錢包安全非常棘手,所有難以發現的漏洞和潛在問題通常存在於多個缺陷的交匯處:密碼學、對本地儲存的存取、應用缺乏身份驗證、輸入缺乏驗證。即時每個問題點都相對較小,但當它們組合在一起時,會暴露更多意想不到的可攻擊表面

檢查加密錢包 APP 的安全性

如果我們按照軟體與硬體錢包來區分的話,硬體錢包的選擇相對比較簡單一點,基本上選擇市佔率第一的通常沒有什麼問題,但是軟體錢包的發展就相當快了,尤其是這個多鏈的時代,有各式各樣的軟體錢包供我們選擇。

軟體錢包又包含了瀏覽器錢包以及手機錢包,瀏覽器錢包通常是開源的,並且都會有多人審計,且目前多數主要由少數幾家錢包廠商壟斷,因此這篇文章主要的重點會放在如何檢查加密錢包 APP 的安全性。

1. 資產的所有權

錢包的兩大類型:託管與非託管 — 沒有私鑰就不算真正擁有加密資產 — KryptoGO

使用錢包最重要的第一個步驟就是先檢查他到底是不是真的託管錢包。檢查方式很簡單,當你發送任何交易的時候,直接按照 Tx ID 到區塊鏈瀏覽器查看自己的錢包地址是否是自己獨有,還是像整個交易所一樣共用。

如果是託管錢包,那麼代表資產並不是自己可以持有動用的,唯一能做的就是相信他們公司,對這家公司以及背後的經營團隊做盡職調查:團隊成員過去是否有不良記錄、過去的產業經驗、公司信用、團隊技術能力、是否有取得相關的認證標準…等等。

因為託管錢包更多的是公司以及團隊信用,當然基本的技術能力還是要有的,如果沒有可能導致以下常見的低級錯誤發生:

  1. 密鑰管理不善:將加密密鑰與數據一起以明文形式存儲;缺少密鑰輪換、撤銷、過期;將加密密鑰用於多種不同目的。
  2. 記憶體管理不善:在應用程式碼中流竄敏感資料,而不是限制其在記憶體、硬碟和 UI 上的生命週期。
  3. 甚至以明文形式儲存錢包會使用到的敏感資料。

KryptoGO Wallet 屬於非託管加密錢包

KryptoGO 自 2019 年創立,早在 2019 年的時候就獲得 Etherscan 認可選為智能合約審計以及資安的推薦廠商。團隊有多年的區塊鏈經驗,豐厚的技術實力也獲得政府、銀行、以及國際認證機構的認可。

Ethereum Directory for Smart Contracts — Smart Contracts Audit And Security | Etherscan

2. 加密錢包應用本身的安全機制

加密錢包需要在很多個環節做好保護,例如:檢查設備是否受信任、是否已 Root 或越獄、是否安裝了潛在有害的應用程式、或逆向工程工具等。(現在有惡意 APP 可以用來竊取使用者的憑證、助記詞或私鑰)。這部份可以按照 OWASP MASVS L2 的建議對實施逆向工程和篡改保護。

行動平台(iOS、Android)提供了很多硬體層級的安全控制,要求使用者設置密碼是相對容易實作的功能,開啟這層的保護就可以為攻擊者製造多一層的阻礙。如果未安裝密碼,任何人都可以解鎖手機並竊取錢包數據,甚至訪問鑰匙串/鑰匙庫。

另外放入 Keychain/Keystore 之前最好都要對敏感資料進一步加密,這樣一來即使手機受到攻擊並且攻擊者可以存取 Keychain/Keystore,拿到的也只是加密後的資料。

KryptoGO Wallet 全方位保護各個環節

  1. 不支持舊設備或是有資安風險的舊版本,使用作業系統原生安全儲存,限制敏感資料的生命週期,從而降低成功攻擊和數據洩露的風險。
  2. 將敏感資料全部保存在原生系統提供的安全儲存區域中。
  3. 在開發階段做完整的程式碼審查,每個人提交的合併要求至少要通過第二人複核。
  4. 對開發者的設備還有工作環境做好保護,避免社交攻擊。
  5. 提交審核之前做全面的滲透測試確保沒有程式碼邏輯造成的漏洞。
  6. 在錢包 APP 的使用流程考慮各種情境,包含:手機掉了、號碼換了、或是手機暫時借給別人,我們確保每一個使用環節都滴水不漏。

3. 非託管錢包的本地儲存

由於非託管錢包需要在本地儲存助記詞、種子和私鑰,因此了解本地存儲的工作原理以及針對它的常見攻擊方式至關重要。

以下是開發人員可以檢查的事項:

  • 應該使用什麼樣的存儲來提供最佳的安全?
  • 存儲是否可以作為文件訪問?它可以被其他應用程式訪問嗎?
  • 你能驗證這種存儲的真實性嗎?是否有可能從一個錢包中“偷走”存儲空間並將其放入另一個錢包而不會出現問題?
  • 是否有任何完整性檢查?或者任何人都可以更改存儲的數據,而加密錢包不會注意到任何事情。
  • 存儲是否提供其他加密(如:硬體支援的加密方式),還是資料以明文形式存儲?
  • 是否應該在將資料放入存儲之前使用應用程式級加密來加密資料?如果是這樣,加密密鑰將儲存在哪里以及如何私鑰如何衍生?

KryptoGO 使用原生作業系統的安全區域保護助記詞

我們使用 iOS Keychain 以及 Android Keystore 加密保存 AES 加密後的資料。

AES 加密算法是密碼學中的高級加密標準,該加密算法采用對稱分組密碼體制,密鑰長度的最少支持為128、192、256,分組長度 128 位,算法應易於各種硬件和軟件實現。這種加密算法是美國聯邦政府采用的區塊加密標準,AES 標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。

AES 的工作原理

以下是我們針對助記詞加密的方式,從這個公式可以看到我們加密助記詞的方法(沒有全數公開,這樣可以避免暴露不必要的攻擊表面),所有的傳輸環節我們都是密文而非明文:

KryptoGO Wallet 對於助記詞的加密保護

常見問題

Q1:既然是非託管錢包,為什麼還需要我們填寫手機號碼?

手機號碼是為了簡化錢包創建的流程。

我們觀察到現在大部分的錢包對於一般人來說並不是那麼直覺友善,透過大家已經習慣的 Google 或是 Facebook 等帳號密碼登入是一種方式,但是這種方式與 Web3 格格不入,而我們想要打造的是兼顧安全以及易用性的錢包,那麼手機號碼是最直覺的登入方式,就像是使用 Clubhouse 一樣,不需要註冊帳號密碼,每次通過驗證碼以及只有自己知道的錢包密碼就可以找回所有區塊鏈的錢包。

KryptoGO Wallet 設計中考慮各種環節,可以選擇不透過我們託管私鑰。

透過我們託管助記詞是一種選擇,如果第一次使用不放心,可以不選擇匯入,產生全新錢包。使用其他的錢包也是相同道理,錢包 APP 的權力非常大,使用的時候一定要非常留意謹慎,避免受到釣魚攻擊。可以先創建一個錢包或者使用觀察模式,觀察那個錢包的運作邏輯以及 APP 的保護機制,如果錢包是值得信任的再放入助記詞。

Q2:那麼我們錢包會開源嗎?

開源是一把雙刃劍,從攻擊者的角度來看,如果加密錢包的代碼是開源的,結合 3–4 個漏洞並不難,駭客可以閱讀實作細節設法找到程式漏洞,利用漏洞攻擊。

因此,我們暫時傾向不開源,但是會做黑箱以及灰箱的滲透測試。同時我們會透過正確的安全設計、提高開發人員的安全水平,用最佳合適的密碼原語(Primitives)編寫程式、使用經過驗證的模組與函式庫並正確整合它們來防止安全漏洞。

除此之外,我們投入大量的資源遵循安全軟件開發週期 (SSDLC) ,是世界上少數取得雙 ISO 認證(資安 & 個資隱私)的區塊鏈公司。(詳見:資訊安全與個資隱私的認證 - ISO 27001 與 ISO 27701 介紹 — KryptoGO

推薦閱讀