一、前言
2022 年 9 月 13 日,Unicode 15.0 正式版發布。在 Unicode 15.0 中增加了 4,489 個字符,總共字符數量達到了 149,186 個。這些新增內容包括 2 個新腳本,總共腳本數量達到 161 個,以及 20 個新的表情符號字符。同時,幾個重要的 Unicode 規范也隨著 15.0 版本進行了更新,這其中就包括 Unicode 安全機制(UTS#39)這個規范,它意在減少因 Unicode 字符視覺欺騙帶來的同形異意攻擊(Homoglyph Attack)。
同形異意攻擊(Homoglyph Attack)是非常古老的一種視覺欺騙攻擊方式。在機械打字機時代,很多打字機為了簡化設計和降低制造及維護成本,鍵盤上沒有單獨的 1 和 0。打字員會使用小寫字母 L 和大寫字母 i 來代替數字 1,使用大寫字母 O 來代替數字 0。當這些相同的打字員在 70 年代和 80 年代初轉變為計算機鍵盤操作員時,他們的舊鍵盤習慣在他們的新職業中繼續存在,并成為極大混亂的源泉。這應該是視覺混淆、同形異意攻擊集中爆發的一個時期。
在此之后,打字機被文字處理器所代替,信息化時代逐步到來,字符編碼也開始由 ASCII 字符集逐漸擴充到 Unicode 字符集。我們開始使用瀏覽器或其他應用客戶端來呈現文本,那些在某些語境中不適合使用同形字書寫 URL、公式、源代碼、ID 等等,其相似的外觀繼續使得用戶可能在視覺上無法區分。
Unicode 視覺欺騙取決于視覺上可以混淆的字符串:兩個 Unicode 字符串外觀上非常相似,在通常的屏幕分辨率下,它們以小尺寸的普通字體出現,很容易讓人們誤認為是另一個。視覺混淆沒有明顯的規則:當尺寸足夠小時,許多字符都看起來像其他字符。“屏幕分辨率下的小尺寸”是指大多數腳本使用 9-12 像素的字體。易混淆性還取決于字體的風格:對于傳統的希伯來字體,許多字符只能通過細微的差別來區分,而這些細微差別可能在小尺寸時丟失。在某些情況下,字符序列也可用于欺騙:例如,“rn”(“r”后跟“n”)在許多 sans-serif 字體中與“m”在視覺上混淆。
近些年來,因 Unicode 編碼欺騙發生了很多惡意攻擊事件,人為或編譯器或 AI 都可能因 Unicode 欺騙產生錯誤的判斷和解析。例如 2021 年有研究人員在谷歌等商業系統中使用 Unicode 的這些特殊字符對 NLP 模型進行對抗攻擊。他們通過一些不可察覺的編碼注入——比如一個不可見字符、同形符、重新排序或刪除的操作字符,可以顯著降低一些模型的性能,大多數模型都可能在功能上失靈(https://arxiv.org/abs/2106.09898)。
Uniswap增長負責人:PayPal等與Uniswap接觸交流,并對DeFi興趣濃厚:官方消息,Uniswap增長負責人Ash表示,很多傳統中心化交易的公司都想和我們接觸交流,包括PayPal、eTrade、Stripe,它們似乎看到了DeFi世界正在發生的事的魔力,且想成為其中的一部分。[2021/7/25 1:14:02]
2022 年 Trezor 這款知名的硬件錢包出現了大量的網絡釣魚網站,釣魚鏈接https://suite.tr?zor.com。這個釣魚鏈接和真實 Trezor 官方網站 trezor.io 極為相似。(此案例來源于《區塊鏈黑暗森林自救手冊》:https://github.com/slowmist/Blockchain-dark-forest-selfguard-handbook/blob/main/README_CN.md)
雖然基于客戶端的尤其是瀏覽器端的抵御視覺欺騙的防御措施一直在完善,但并沒有辦法完全封堵住這種攻擊。第一,視覺欺騙是一種很難被完全消亡的攻擊,因為在足夠小的尺寸情況下人自身的生理視覺體系也是無法分辨的;第二,Unicode 字符集非常龐大,并且在不斷的增加;第三,需要標準組織、瀏覽器開發商、域名注冊商等多方共同協作去完成。
本文主要研究當下 Unicode 中因字形渲染、混合腳本、PunyCode、雙向文本、組合字符引起的視覺欺騙問題,結合作者發現的不同類型的 Unicode 視覺欺騙漏洞,分享漏洞挖掘過程方法并給出一些防御的思路。
二、字形渲染帶來的安全風險
當字體或渲染引擎對字符或字符序列的支持不足時,就使得本應該在視覺上可以區分的字符或字符序列出現新的問題--視覺混淆。尤其是這些字符被做為關鍵的信息出現時,比如在瀏覽器重要的安全指示器地址欄中,這種視覺欺騙的危害就會顯而易見。瀏覽器廠商對于地址欄上的 IDN 欺騙問題,一直在做積極的防御,通常是在瀏覽器里維護一個重要域名列表,如果一個域名和列表中的域名同形異議,則將其轉化為 Punycode 編碼顯示。
渲染支持不足,直接導致每一個字符的字形含義往往超出我們的預期,這種不確定性使得視覺欺騙隨時都可能發生。那么字形到底是什么,它和字型、字符、字體有什么關系,包括 Unicode 中越來越火的 Emoji 表情它是字符嗎?其中一些基本的名詞概念非專業人士經常混淆,我們先簡要了解下。
Bitwise推出DeFi指數基金 支持UNI AAVE等代幣:加密資產管理公司Bitwise今日宣布,已推出首只DeFi指數基金:Bitwise DeFi加密基金,該基金為合格投資者提供對DeFi代幣的敞口。該基金啟動時只有少量種子資產,每周兩次認購,該基金最初將包括Uniswap、Aave、Synthetix、Maker、 Compound、 UMA、Yearn.Finance、0x和Loopring。(TheBlock)[2021/2/17 17:24:50]
字體(英語:Typeface)指的是一組字符的設計,通常包括字母、一組數字和一組標點符號。也常包括表意字符以及制圖符號。每個字體都是字形的集合,比如宋體、黑體等。有些字體技術非常強大,比如 TrueType/OpenType,它們可以根據分辨率、系統平臺、語言等來選擇顯示最佳的形狀。但是,它也可以用于安全攻擊,因為它足夠強大,可以在打印時將屏幕上的“$ 100.00”外觀更改為“$ 200.00”。 此外,層疊樣式表(CSS)可以更改為不同的字體,用于打印與屏幕顯示,這可以使用更多可混淆字體。這些問題并非特定于 Unicode。為了降低此類漏洞利用的風險,程序員和用戶應該只允許可信任的字體。
字型(英語:font;傳統英式英語:fount)是指印刷行業中某一整套具有同樣樣式和尺碼的字形,例如一整套用于內文的宋體 5 號字、一整套用于標題的 10 號字就叫一套字型。電腦早期用點陣字,仍然有字型概念,同樣一套風格如中易宋體,一套字型是指一整套 15×16 像素或一整套 24×24 像素的字。矢量字型出現后,同一套風格字型已不用制作不同像素字型,只需制作一套即可隨意縮放,“字型”與“字體”之間的界限開始模楜。一般的英語使用者同樣分不清“字型”(Font)與“字體”(Typeface)的分別。
字形(英語:glyph),又稱字圖或書形,是指字的形體。中華人民共和國國家標準 GB/T 16964《信息技術·字型信息交換》中定義字形為“一個可以辨認的抽象的圖形符號,它不依賴于任何特定的設計”。在語言學中,字(character)是語意的最基本單位,即語素;字形是指為了表達這個意義的具體表達。同一字可以有不同的字形,而不影響其表達的意思,例如拉丁字母第一個字母可以寫作 a 或 ɑ,漢字中的“強/強”、“戶/戶/戸”。
在復雜的腳本(如阿拉伯語和南亞語腳本)中,字符可能會根據周圍的字符更改形狀。
(1)字形可以隨周圍環境所改變
逾2.3萬枚ETH從未知地址轉至Uniswap:Whale Alert數據顯示,北京時間10月30日18:43,23179.008枚ETH(價值8702434美元)從0x5bd87開頭未知地址轉至Uniswap(0x7a250d開頭地址)。[2020/10/30 11:16:06]
3 個 arabic letter heh (U+0647) 組合在一起
(2)多個字符可以產生一個字形
f = latin small letter f (U+0066)
i = latin small letter i (U+0069)
我們來看一個和視覺有關的,當多個不同字符組合后可能視覺外觀是相同的。例如字符 U + 0BB6 SHA 和 U + 0BB8 SA 通常非常不同。但這兩個組合的字符序列,視覺感官上完全相同。底層的二進制是不同的。
其實多字符組合不僅僅是視覺欺騙,有時這種多字符組合也可以導致系統內存崩潰。CVE-2018-4124 這個漏洞可導致 macOS High Sierra 10.13.3 在處理惡意制作的字符串時致堆損壞。???? 的原始序列是 U+0C1C U+0C4D U+0C1E U+200C U+0C3E,這是一個泰盧固語字符序列:輔音 ja (?)、virama (?)、輔音 nya (?)、零-width 非連接符和元音 aa (?)。當 macOS 在處理 ???? 這個字符序列時,即可導致系統崩潰。
表情符號(英文:Emoji)是象形文字(圖形符號),通常以彩色卡通形式呈現并在文本中內聯使用。它們代表面部,天氣,車輛和建筑物,食物和飲料,動物和植物,或代表情感,感覺或活動的圖標。Emoji 已經無處不在,它正在成為跨越不同文化的所有人通用的語言。但不同人對 Emoji 的使用理解以及各個操作系統碎片化的支持,也使得帶來了一些問題。比如:短期內你也不會看到步槍的表情符號,U+1F946。Unicode 組織包括蘋果和微軟都反對加入步槍符號。手槍和其他武器的 Emojis 已經使人們陷入了法律的困擾。之前一家法國法院裁定手槍表情符號可能構成死亡威脅,將一名把槍的表情發給前女友的男子判處三個月監禁。
FTX創始人:警惕Uniswap上的SRM假幣:8月6日消息,加密衍生品交易所FTX的創始人Sam Bankman-Fried發推提醒用戶警惕Uniswap上的SRM假幣。他表示,目前SRM還不能交易,如果你在Uniswap等平臺上看到SRM,那么這是假幣。[2020/8/6]
在瀏覽器地址欄中直接渲染 U+1F512 這個編碼也是相當危險的。因為它和 HTTPS 安全小鎖外觀上非常相似。攻擊者可以對其進行安全小鎖的偽造。U+1F512 編碼曾在 Chrome/Firefox 瀏覽器中出現過這樣的安全問題。
三、混合腳本帶來的安全風險
混合腳本是有很多合法的用途的,例如 Ωmega。但視覺上容易混淆的字符通常不會放在一個腳本中。在視覺上容易混淆的字符為欺騙提供了許多機會,例如下面這兩個域名,希臘小寫字母 Omicron 和拉丁文 o 外觀是非常相似的。
很久之前,域名只允許包含拉丁字母 A-Z,數字和一些其他字符(ASCII 字符集)。之后大家發現,僅僅支持 ASCII 碼的域名可能是有問題的,因為世界上還有很多非拉丁文語系的國家和地區,他們也渴望在域名中使用自己的語言符號。后來經過多次提案討論,在 2003 年發布了國際化域名的規范 [rfc3490],它允許大多數的 Unicode 在域名中使用,普遍將這個規范稱為 IDNA2003。之后在 2010 年批準發布了對 IDNA2003 的修訂版 [rfc5895],稱這個修訂版為 IDNA2008。但 IDNA2003 和 IDNA2008 并沒有有效的解決國際化域名中的某些問題。隨后,Unicode 聯盟發布了 [UTS-46] 解決了某些兼容性的問題。
在 IDNA 中使用 PunyCode 算法來實現非 ASCII 域名到 ASCII 域名的轉換。PunyCode 算法可以將任何一個非 ASCII 的 Unicode 字符串唯一映射為一個僅使用英文字母、數字和連字符的字符串,編碼的域名在前面都加上了 xn-- 來表明這是一個 PunyCode 編碼。
國際化域名(IDN)是在 Unicode 中定義的任何字符集或腳本中注冊的二級或三級域名或 Web 地址。直到 2009 年底之前,頂級域名僅限于拉丁字母 a-z,之后隨著 Web 全球化發展,IDN TLDs 也開始逐漸推廣和普及,這加速了全球化進展的同時,也帶來了一些安全風險,這點在后面我們會談到。
聲音 | UNICEF基金經理:加密貨幣可徹底改變人道主義援助:聯合國兒童基金會(UNICEF)創新計劃基金經理Sunita Grote在接受采訪時表示,加密貨幣可以徹底改變人道主義援助。Grote稱,幾年來聯合國兒童基金會創新辦公室一直在探索使用區塊鏈,并且其有三個主要好處:區塊鏈使其能夠利用聯合國兒童基金會的新資源基礎,并擴大網絡來獲得捐款;區塊鏈可以通過更透明的方式跟蹤資源和交易流來提高效率和透明度;該辦公室正在探索區塊鏈如何顛覆和改善為兒童提供程序的系統。區塊鏈可以使他們以新的方式付款并改善現金轉賬的方式。(cointelegraph)[2019/10/22]
在前文中我們已經了解到,Unicode 15.0 中的字符總量 149,186 個,腳本數 161 個。這些腳本中大部分都可以被用于域名注冊,并且數量還在增加中。以頂級域名(TLD)COM 為例,Verisign 制定了 IDN 注冊的策略,規定了允許和禁止的代碼點。并制定了 IETF 標準、對特定語言的限制、對腳本混淆的限制、ICANN 受限 Unicode 代碼、特殊字符這五條驗證規則,遵循這五條規則的 IDN 被認為是有效的注冊。
在這五條 IDN 注冊規則中,我們會重點關注“腳本混淆的限制”這條規則,因為這對發現 IDN 上的視覺欺騙問題有幫助意義。
[對腳本混淆的限制]
Verisign 不允許使用混合的 Unicode 腳本進行注冊。如果 IDN 中包含兩個或多個 Unicode 腳本代碼,將拒絕注冊。例如拉丁文腳本中的字符不能和任何西里爾字符在同一個 IDN 中使用。IDN 中的所有代碼必須來自同一個 Unicode 腳本。這樣做是為了避免混淆的代碼出現在同一個 IDN 中。
下表列出了允許使用的 Unicode 腳本。
列舉我之前發現的一個漏洞,[CVE-2018-4277] Spoof All Domains Containing ‘d’ in Apple Products 。我在研究中發現,在蘋果產品中編碼 latin small letter dum (U+A771) 渲染的字形和 latin small letter d (U+0064) 極為相似。從 Unicode 中 (U+A771) 的字形標準可以發現(http://www.unicode.org/charts/PDF/UA720.pdf),d 后面應該還有一個小撇,但是在蘋果產品中把這個完全忽略掉了。
接下來,我去注冊了一個真實的域名,使這個 IDN Spoof 可以正常運行。我們知道在 Verisign 制定的 IDN 注冊的規則中,不允許使用混合的 Unicode 腳本進行注冊。如果 IDN 中包含兩個或多個 Unicode 腳本代碼,將拒絕注冊。而(U+A771)也是屬于 Latin,應該是符合域名注冊商規則的。于是域名成功注冊成功了。
我又注冊了一個 SSL 證書,使這個 IDN Spoof 看的會更加真實完美。效果如下,Safari 并沒有將這個域名轉化為 punycode 顯示,所以我們成功了。
到這里我們確定了整個欺騙流程是完全可行的,那么攻擊者可以偽造域名中有 d 的所有域名。在 Ggoogle 統計的 Top 10k 域名中,大約有超過 25% 的網站域名中有d這個字符。這些網站的域名都可以被偽造。
https://chromium.googlesource.com/chromium/src/+/master/components/url_formatter/top_domains/alexa_domains.list
?linkedin.com
?baidu.com
?jd.com
?adobe.com
?wordpress.com
?dropbox.com
?godaddy.com
?reddit.com
…………
[蘋果修復的補丁]
[受影響產品]
watchOS 4.3.2 https://support.apple.com/zh-cn/HT208935
iOS 11.4.1 https://support.apple.com/zh-cn/HT208938
tvOS 11.4.1 https://support.apple.com/zh-cn/HT208936
macOS High Sierra 10.13.5 https://support.apple.com/zh-cn/HT208937
四、雙向文本帶來的安全風險
某些字符(例如阿拉伯語和希伯來語腳本中使用的字符)具有固有的從右到左的書寫方向。當這些字符與從左到右顯示的其他腳本或符號集的字符混合時,生成的文本稱為雙向(縮寫為 bidi)。文檔的內存表示(邏輯順序)與雙向文本的顯示外觀(可視順序)之間的關系由 UAX#9:Unicode 雙向算法 [UAX9] 管理。
由于某些字符具有弱或中性的方向性,而不是強左向右或從右到左,因此 Unicode 雙向算法使用一組精確的規則來確定最終的視覺呈現。然而,任意文本序列的呈現,可能導致文本序列無法清晰地被閱讀,或者可能在視覺上混淆。
在一個 URL 中,經常會遇到多種方向性(弱性、中性、強性)的字符同時存在的情況。雖然 Unicode 雙向算法使用一組精確的規則來確定最終的視覺呈現,但是多種方向性的文本序列在呈現時,還是可能導致文本序列無法清晰地被閱讀,或者可能在視覺上混淆。
Chrome 之前出過這樣一個漏洞,在 Chrome 里訪問:
在地址欄中實際渲染為:
CVE-2018-4205 是我之前發現的一個漏洞,利用了 RTL 和空白符導致了 URL 地址欄欺騙。下面就以這個漏洞為例進行講解。
(1)構造 POC-1
訪問 http://www.apple.com.xn--ggbla3j.xn--ngbc5azd/。可以看到
Chrome/Firefox/Safari三個瀏覽器地址欄,顯示都是一樣的。Edge 顯示 punycode。
(2)構造 POC-2
在四個瀏覽器中訪問 POC-2,我們此時已經發現了問題。在 Safari 中出現了 RTL 和空白字符。
(3)構造 POC-3
慢霧科技
個人專欄
閱讀更多
財經法學
成都鏈安
金色早8點
Bress
鏈捕手
PANews
Odaily星球日報
加密游戲仍處于起步階段。區塊鏈可擴展性和基礎設施的最新進展現允許完全在鏈上構建新的游戲類型,這為加密經濟以及更廣泛的去中心化生態系統的集成開辟了道路.
1900/1/1 0:00:00作者:Alex Reeve為了給世界創建一個開放的金融系統,我們需要確保每個人都可以使用Web3.
1900/1/1 0:00:00頭條 ▌Blockworks:以太坊合并大約在9月15日或16日進行8月12日消息,Blockworks 發文表示,以太坊合并大約在 9 月 15 日或 16 日進行.
1900/1/1 0:00:00原文:《Top 10 GameFi Development Companies: 2022 and Beyond》by Nordic Blockchain Experts編譯:ChinaDeFi.
1900/1/1 0:00:00以太坊合并可能導致一場經濟上的混亂局面,而在這一系列不確定中,仍存在確定性的機會。原文作者:Lucas Campbell,Bankless 分析師原文編譯:AididiaoJP,Foresigh.
1900/1/1 0:00:00近期,在新一輪公鏈敘事中,有著 Move 雙子星之稱的高性能新公鏈 Aptos 與 Sui,均收獲了行業中眾多開發者、明星機構和用戶的廣泛關注.
1900/1/1 0:00:00