在游戲《最終幻想》中,來自蘭迪斯共和國的全能戰士巴修被稱為最強之盾,他身經百戰、勇猛果斷,被子民視為英雄。而在區塊鏈世界,Zcash、門羅幣、零知識證明等存在,也被稱為隱私的最強之盾,它們可以有效確保交易信息不被泄露,然而,這個世界真的存在密不透風的墻嗎?
本期的學術分享,我們重點推薦斯坦福大學教授Dan Boneh等人最新的研究成果《針對匿名交易的遠程側信道攻擊》。
而在硬核技術文章精選部分,我們還會看到zkSNARK 證明優化、Taproot/Schnorr升級、閃電網絡局限性、Substrate等內容。
另外,在過去的一周當中,以太坊1.X、以太坊2.0以及Layer 2也迎來了眾多技術進展。
比特幣作為最大的加密貨幣,其交易其實并不是匿名的,眾多學術研究已經表明,比特幣的交易圖可以被有效去匿名化,即使是很多所謂的匿名加密貨幣也是如此。
而對于那些希望在公共區塊鏈上獲得交易隱私的用戶而言,像Zcash、門羅幣(Monero)這樣的匿名加密貨幣系統,因使用了相當高級的密碼學原語,例如簡潔零知識證明(zkSNARKs)和環簽名(ring signatures),從而提供了更高程度的不可鏈接性。那使用這樣的系統,用戶可以高枕無憂了嗎?
實際上,盡管它們擁有了強大的密碼學原語保護,但還是會存在一些協議層的隱私攻擊方式會對這些系統的隱私性構成威脅,這也是斯坦福大學教授Dan Boneh等密碼學大牛最新的研究成果。
原論文鏈接:https://crypto.stanford.edu/timings/paper.pdf
(注:研究者向Zcash和Monero安全團隊披露了這些攻擊,并且他們已在最新版本客戶端中修復了相關漏洞。例如,Zcash v2.0.7-3版本客戶端引入了初始修復,v2.1.1-1版本客戶端為區塊處理中的時間側信道引入了進一步的修復。而Monero則在v0.15.0版本客戶端中引入了修復。將客戶端更新到最新版本的用戶,將不易受到此類攻擊的威脅。另外,由于攻擊需要監視和參與Zcash或Monero網絡,因此此類攻擊并不能追溯以往的交易。)
1、1 匿名支付系統的架構
在描述相關攻擊之前,我們先來了解下隱私加密貨幣(以Zcash和Monero為例)的一些核心設計概念。這些加密貨幣是建立在比特幣的UTXO(未花費交易輸出)模型之上的,即每筆交易會花費以前交易的輸出,并產生新的輸出。這些UTXO的集合會記錄在區塊鏈中,并表示流通中的總貨幣。
貨幣的每個用戶都擁有一個或多個公鑰(也稱為地址),并且連接到P2P網絡以發送和接收交易。
隱私目標:在比特幣中,UTXO是一個(amount,pk)元祖(tuple),其中pk代表接收者的公鑰。為了以后使用這個UTXO,接收者在相應的密鑰下生成一個簽名。這樣,一筆交易就顯示了所用貨幣的數量、資金的來源(即使用了哪些UTXO)及其目的地(即新UTXO所有者的公鑰)。
此外,用戶的公鑰可鏈接至其向網絡發送交易時連接到的P2P節點。
而Zcash和Monero等匿名加密貨幣,旨在提供以下更強的隱私保障:
1. 保密性:交易不披露交易金額;
2. 不可追蹤性:當交易花費UTXO時,很難識別交易生成了該UTXO;
3. 不可鏈接性:給定兩筆發送到網絡的交易(最多有一筆是由對手發送),則對手無法判斷它們是否支付相同的地址。此外,給定兩個地址,對手無法確定它們是否屬于同一用戶;
4. 用戶匿名:給定用戶地址(即公鑰),對手無法確定該地址的所有者如何連接到P2P網絡;
而這些隱私保障,通常是通過密碼學技術的組合來實現的,下面我們將簡單地描述下這些技術:
1. 保密交易技術(CT)隱藏了交易資金的數額,一筆保密交易的UTXO形式為(Commit(amount), pk),也就是說,它們只顯示交易金額的密碼學承諾。交易還包括證明其總余額為0的一個證明。
2. UTXO匿名集通過隱藏交易輸入的身份提供不可追蹤性。具體來說,匿名交易不會顯示它花費的UTXO,而只顯示一個超級UTXO集,以及這個集合中某些UTXO所有權的零知識證明。
3. 混淆及多樣化地址保證不可鏈接性。為了防止發送到同一地址交易的可鏈接性,匿名交易的UTXO包含一個“混淆”公鑰(例如,Zcash中對該密鑰的承諾)。多樣化地址(或Monero中的子地址)使得用戶能夠匿名地與多個實體進行交易,而無需管理多個密鑰。通過單個密鑰sk,用戶可以創建多個公鑰pk1,…… pkn。這些密鑰是不可鏈接的:很難確定兩個公鑰pk、pk0是否來自于同一個密鑰。
區塊鏈掃描是不可鏈接性的技術后果。由于匿名交易的UTXO并不會清晰顯示接收方的公鑰,因此用戶必須掃描每筆新交易并執行各種密碼學操作,以檢查交易是否和它們有關。
用戶匿名性由不可追蹤性和不可鏈接性保證。由于交易不會顯示發送方或接收方的公鑰,因此用戶的公鑰不能鏈接至其用于發送或接收交易的P2P節點。
(1)用戶的錢包創建一筆交易,這涉及到生成一個密碼學證明。此計算可以在本地執行,也可以外包給遠程服務。(2) 錢包將新交易發送到P2P節點,P2P節點將其廣播到網絡中。(3)P2P節點與連接的錢包共享接收到的交易,連接可以是本地的或遠程的。在交易創建期間,對手1a可以計時外包的證明生成,以泄漏某些交易秘密。在處理一筆新交易時,錢包作為交易的收款人時,其行為可能會發生變化。如果錢包連接到遠程節點,這可以由觀察錢包和節點之間通信模式的對手1b,或控制該節點的對手3來推斷。如果錢包和節點位于同一位置,則與用戶的P2P節點交互的對手2,就可以推斷錢包行為的變化。
匿名交易的生命周期。圖1說明了如何通過P2P網絡創建匿名交易,并與節點和錢包進行共享:
1. 為了發送新的交易,用戶的錢包選擇一些UTXO,并產生零知識交易有效性證明;
2. 交易被發送到連接至錢包并與網絡共享的P2P節點。P2P節點將這些交易存儲在它們的“存儲池”(Mempool)中;
3. P2P節點與連接的錢包共享這些交易。錢包掃描每一筆新交易,以檢查它是否是交易的收款人。一旦一筆交易被納入區塊當中,就會執行步驟2和步驟3。當一個區塊被挖掘時,該區塊及其包含的交易將被廣播到所有P2P節點。然后區塊的交易就和用戶的錢包進行共享了。
1、2 攻擊結果
了解完匿名支付系統的架構,我們來簡單認識下研究者提出的攻擊,究竟會帶來什么樣的后果。
據悉,這些攻擊是利用了系統不同部分泄露的通信模式或時間信息,攻擊者通過系統的方法,觀察匿名交易在系統中的生命周期。在每一步,研究者都會尋找側信道,并評估它們對用戶隱私的影響。
在圖1所示的匿名交易生命周期當中,攻擊者可在這些步驟中的每一步觀察側信道信息,并嘗試了解有關交易的信息,例如:預期收款人的身份(例如,他們的公鑰或他們的P2P節點的IP地址)、交易轉移的資金量或資金來源。
下面是研究結果:
1、在Zcash中,用戶的錢包和P2P節點是在單個進程中運行的。錢包通過嘗試使用它的密鑰對其進行解密,以檢查它是否是每個傳入交易的收款人。而這導致了側信道泄漏的兩個來源:(1)如果解密成功并且解密的交易(稱為Note純文本)格式正確,則錢包將執行額外的Pedersen承諾校驗; (2)如果解密成功,但是解密的交易格式不正確,則錢包會拋出一個異常,而該異常會傳播到節點的P2P層。
在第一種情況下,執行額外Pedersen承諾檢查所花費的時間,會導致P2P節點對后續網絡消息的響應出現延遲。
因此,研究者提出了一種稱為PING的攻擊,攻擊者可使用ping響應中的延遲,來推斷節點是否為交易的收款人。這破壞了交易的不可鏈接性。
在第二種情況下,研究者提出了一種REJECT攻擊,其中攻擊者小心地處理格式錯誤的交易,在已知(但匿名)公鑰下對其進行加密,并將其發送到目標P2P節點。如果解密成功,則會觸發異常,并且目標節點將明確的“reject”消息發送回攻擊者。
攻擊者在收到此消息后,其就能知道所選的公鑰屬于目標P2P節點的所有者,而這違反了匿名性。
有關PING和REJECT攻擊的詳細信息,有興趣的讀者請參見原論文第四節。
2、對于Monero而言,其錢包和節點也在單獨的進程中運行,研究證明,支付接收會更改錢包及其節點之間的通信模式。
如果錢包連接到遠程節點(在移動錢包中很常見,或者在首次與網絡同步時很常見),則被動網絡對手可以推斷該錢包是否是最近交易的收款方。(有關細節,請參見原論文第五節)
此外,即使用戶的錢包和節點位于同一位置,研究者也表明,遠程對手可引起和觀察節點資源的鎖競爭(Lock Contention),來推斷錢包到節點的通信模式。
研究者在廣域網中驗證了這種時間攻擊,一位位于倫敦的攻擊方可推斷受害者(在蘇黎世運行的節點和錢包)是否收到了付款。
對于Zcash和Monero而言,這類攻擊使遠程對手能夠通過識別每個交易收款人的P2P節點來鏈接匿名交易。如下面所述,攻擊可進一步被利用于:(1)根據用戶的公鑰識別其P2P節點的IP地址;(2)打破屬于同一用戶的各種地址的不可鏈接性。
對于Zcash,這些攻擊還能夠:(3)在給定用戶公鑰的情況下遠程導致Zcash節點崩潰,以及(4)在涉及用戶長期秘密查看密鑰的(非恒定時間)ECDH密鑰交換上創建遠程時間側信道,這可能導致查看密鑰的泄漏。
這些攻擊可能會使關注隱私的加密貨幣用戶處于危險之中。例如,將用戶的匿名公鑰鏈接到其P2P節點的對手,可以發現用戶的真實身份或位置,一個打破不可鏈接性的對手,可以推斷哪些P2P節點屬于正在進行交易的用戶。
3 zkSNARK生成中的側信道,此外,研究者還觀察到,在Zcash中,生成zkSNARK的時間不是恒定的,而是取決于交易金額的漢明權重(hamming-weight)等秘密信息。研究實驗表明,目前的zkSNARK實現在實際中并非是零知識的:從時間泄露中收集的信息會使零知識屬性失效。如果對手能夠測量zkSNARK生成過程的運行時間,則可以提取此信息。當然,正如下文所解釋的,在當前的Zcash系統中,可能很難利用這種泄漏。
1、3 攻擊方式概述
了解完了攻擊帶來的后果,我們重點來認識下這類通用攻擊方式,以及針對zkSNARK Prover的時間攻擊,而針對Zcash和Monero的具體攻擊方式,則省略不談。
1、威脅模型
本文所描述的攻擊屬于遠程側信道攻擊。因此其并不要求受害者的軟件被替換,我們可以考慮這樣一個遠程對手,如圖1所示:
1. 一個網絡對手(圖1中的對手1a和1b)監視受害者錢包和遠程服務(例如節點或驗證程序)之間的加密通信量。
2. 一個P2P對手(對手2)參與P2P網絡。攻擊者可能會偏離P2P協議。
3. 一個遠程節點對手(對手3)控制一個第三方P2P節點,并監視受害者的錢包與該節點之間的(明文)通信。
2、攻擊類型一:接收方側信道
研究發現,最實用和最普遍的側信道攻擊,會影響圖1所示的匿名交易生命周期的最后階段(即錢包處理新交易時)。這些攻擊使遠程對手能夠破壞系統的不可連接性和匿名性保證。
這種攻擊利用了相關匿名加密貨幣普遍存在的設計缺陷,即用戶的錢包會定期檢查它是否是任何新交易的收款人。
目標:這類攻擊針對的是交易不可鏈接性和用戶匿名性。因此,攻擊者的目標是:(1)確定兩筆交易是否支付相同的地址,(2)確定已知地址的用戶如何連接到P2P網絡。
這種攻擊針對的是錢包與P2P節點的常見部署,其實際目標是識別交易收款人正在使用的P2P節點。在多個用戶將其本地錢包連接到共享遠程P2P節點的設置中,網絡對手或遠程節點對手發起的攻擊,可進一步識別出交易收款人使用的實際錢包。
這里考慮兩種不同的攻擊場景:
1. 對手知道一個匿名公鑰,并向該密鑰發送一筆交易,以確認密鑰所有者用于接收交易的P2P節點(或錢包)。
2. 誠實的用戶發送一筆交易,對手不知道預期的收款人或其公鑰。對手決定交易的收款人使用哪個P2P節點(或錢包)。
實際上,后一種攻擊場景包含了第一種情況,因為對手可以將精心編制的交易發送到已知公鑰。后一種場景會直接導致交易不可鏈接性的中斷。
給定發送到網絡中的兩筆交易,對手只需要確定兩筆交易的收款人是否使用了相同的P2P節點還是錢包。此外,這兩種攻擊場景都代表了用戶匿名性的中斷,并且可被用于其它隱私侵犯:
1. IP地址恢復,對手可以將公鑰鏈接到所有者P2P節點的IP地址(如果連接到遠程節點,則可以鏈接到其錢包),除非所有者使用匿名工具(如Tor)。而此信息可被用于識別受害者,并對其進行地理定位。
2. 鏈接多樣化地址,給定兩個公鑰,攻擊者可以確定它們是否屬于同一用戶。攻擊者向每個公鑰發送一筆交易,并檢查是否標識了同一節點或錢包。這打破了多地址的不可鏈接性。
3. 恢復私鑰,這些攻擊背后的漏洞,也為通過時間側信道提取受害者的“查看”密鑰開辟了途徑。竊取此密鑰,可以讓對手將發送給受害者的所有交易鏈接起來(但無法竊取受害者的資金)。
攻擊策略
研究者的攻擊利用了加密貨幣錢包(收款人和非收款人)處理交易的方式差異。
這種錢包行為的差異,其本身并不是問題,因為遠程攻擊者無法直接與用戶的錢包交互。然而,研究發現,由于各種設計缺陷,錢包行為的差異影響了錢包與其P2P節點之間的交互。反過來,這就使得遠程攻擊者可通過各種側信道推斷錢包到節點交互的變化。
對此,研究者提出了兩種通用攻擊策略:
策略1,錢包到節點通信的流量分析。如果錢包連接到遠程節點,則網絡對手或遠程節點對手可觀察錢包到節點交互的變化。
策略2,從P2P層推斷錢包行為。如果錢包和節點位于同一位置,則遠程對手無法觀察它們的交互。然而,如果錢包行為的變化,影響了用戶的P2P節點和遠程對等節點之間的交互,信息仍然會泄漏給對手。
這兩種策略,不僅適用于在創建交易并將其發送到P2P網絡時,而且也適用于將其包含在區塊中時。在這一點上,區塊及其所有交易都與每個對等方共享,錢包重新處理交易以確保它們有效(例如確保它們沒有雙花)。
3、 攻擊類型二 : 發送方側信道
上面描述的攻擊,打破了匿名加密貨幣交易的不可鏈接性以及用戶的匿名性,這是利用了P2P客戶端和錢包系統設計中的缺陷。因此,它們并不是直接針對協議密碼學保護的攻擊。為了擴大對匿名交易中側信道漏洞的調查范圍,研究者還對密碼學工具展開了研究,而這些工具保證了交易創建時的機密性和不可追蹤性,論文中特別提到的,便是當前加密貨幣行業使用最多的簡潔零知識證明zk-SNARKs。
注意,這部分描述的攻擊實際上更偏向于理論性質。雖然它們不太可能影響到當前的用戶,但這類攻擊的存在,再次說明了無側信道密碼學實現對于匿名系統的重要性。
攻擊目標:負責確保交易保密性和不可追蹤性的交易發送者。
正如下面討論的,遠程攻擊最可能的目標是恢復交易金額,從而破壞交易的保密性。
然而,針對交易創建的遠程側信道攻擊,實際面臨著很多挑戰:
1. 非交互性:用戶可以在不與任何其他方交互的情況下創建交易;
2. 短暫秘密:許多交易秘密(例如交易金額,以及與UTXO相關的秘密)是一次性的。因此,即使存在一個側信道,對手也可以嘗試一次提取這些秘密;
3. 高熵秘密:用于創建交易的長期秘密(例如用戶的密鑰)具有高熵,并要求提取高精度的側信道;
研究表明,對手理論上可以克服這些挑戰,其目標是交易創建過程的證明階段,并旨在(部分)揭露交易的保密金額。
我們知道,零知識證明是匿名交易的基本構建技術,在zk-SNARK協議中,證明者(prover)有一些秘密輸入(稱為witness),并使驗證者(verifier)確信該witness滿足給定的斷言,而不透露關于witness的任何其他信息。在Zcash和Monero中,此類proof證明了交易的有效性,同時保留了交易的隱私性。例如,在Zcash中,證明witness包含已用UTXO的列表、接收者地址、交易金額,以及保證這些UTXO存在并且屬于支出者,且所有資金都轉移至接收者的證明。
zk-SNARK證明者中的時間側信道。研究者的論題是,在當前的zk-SNARK實現中,生成證明所花費的時間,會泄露有關prover秘密witness的信息,特別是關于花費幣的數量,然而,如上所述,由于交易創建的非交互性質,遠程對手可能很難在證明生成過程中獲得時間側信道。而更糟糕的是,證明生成的時間可能不足以提取短暫或具有高熵的秘密。
盡管存在這些挑戰,但我們在下文中指出,在某些部署方案中,對匿名加密貨幣的zk-SNARK prover進行遠程時間攻擊是可能的,并且演示了證明生成時間,可以泄露有關秘密交易額的重要信息。
關于非交互性,研究者提出了兩個觀察結論:
1. 如果弱客戶端(例如移動錢包)將證明外包給遠程服務,則網絡對手可以計時prover。雖然證明外包的情況并不常見,但Zcash協議是支持這項功能的,遠程證明服務是為早期版本的協議設計的,因而,會有一些用戶可能會選擇將證明委托給遠程服務;
2. 更一般地說,對手可以通過監控P2P網絡來獲取有關交易創建過程何時開始的帶外信息,并觀察何時結束。例如,用戶可以設置定期付款,其中交易是在固定時間創建的。對手還可以觸發一筆交易,以作為某些外部協議的一部分。研究者為數字簽名繪制了一個時間側通道連接。雖然簽名是非交互的,但使用它的協議(例如TLS)可以引入遠程側信道。
對于攻擊者而言,攻擊的目標就是交易量,這是一個非加密值,即使是粗略的近似值(通過單個時間測量泄漏)也構成了對隱私的侵犯。
攻擊策略。研究者考慮了一種利用算術運算中的時間變化(取決于操作數的值)密碼學時間攻擊。
研究利用了這樣一個事實:產生證明的時間與prover的witness值有關。由于witness包含交易金額,攻擊的目標就是該金額與證明時間有關。例如,Zcash的證明將交易量分解為bit,并為每個非零bit計算一次橢圓曲線運算。因此,證明時間與交易金額的漢明權重是密切相關的,也就是說,證明時間與交易金額的值也是相關的。
1、4 關于zkSNARK Prover的時間攻擊
下面,我們進入到zkSNARK Prover的時間攻擊部分,按照上面描述的策略,我們的目標是從證明生成的單個時間度量中,恢復有關保密交易金額的信息。
在下面的部分當中,研究者演示了這種時間攻擊如何揭示Zcash中有關交易量的信息。
而對于Monero中實現的特殊用途證明,類似的攻擊則是無效的。
1、Zcash Prover中的時間側信道
研究者表示,對于Zcash的zkSNARK系統,證明時間在很大程度上取決于證明者witness的值。也就是說,對于匿名交易,證明時間與交易的秘密值是密切相關的。
為了發送一筆交易,發送方創建兩個證明,其中一個證明已花費UTXO的所有權,另一證明新的UTXO是結構良好的。
Zcash使用的是Groth16證明系統,對于攻擊目的而言,只要知道證明者將witness編碼為一個向量(a1,……,am)字段元素,并且證明者的主要計算是以下形式的“多重指數運算”:
其中Gi是固定的橢圓曲線點,重要的是,Zcash的實現優化了aiGi,其中ai = 0。因此,證明時間與證明者的witness中非零字段元素的數量相關。
由于witness中的交易量是二進制編碼的,其漢明權重值就會影響證明時間。而且,由于二進制表示的權重,與數字的絕對值相關,因此證明持續時間泄露了有關保密交易金額的信息。
2、評估
為了評估時間攻擊,研究者進行了一個實驗。
下圖顯示了每個量的證明時間的平均值及標準差。結果顯示,證明時間與交易金額具有很強的相關性(R=0.57)。雖然時間泄露只能得出金額的粗略近似值,但這足以讓對手識別出價值巨大的罕見交易。
1、5 討論和結論
與論文中提到的針對Zcash和Monero的攻擊(已被修復)相比,上述時間攻擊是不容易應用的,它要求對手可以對證明生成進行計時,這取決于用戶的常用模式(例如重付款)或部署策略(例如,將證明外包給遠程服務)。
如果確實存在計時機會,研究表明這種泄露會允許攻擊者對私人交易金額進行粗略估算。
當然,本地側信道攻擊會是更加有效的,然而,Zcash明確地否認了這種威脅。
最終,這種攻擊的存在,對于非恒定時間加密貨幣實現而言,可能會帶來潛在的威脅。Zcash開發者正在開發一個更成熟版本的橢圓曲線算法,并可能在未來部署到主客戶端中。
灑脫喜簡評:這類攻擊的提出,為匿名交易系統的設計帶來了新的挑戰。研究者希望這項工作能夠提醒相關項目方及用戶關于側信道泄露的威脅,并推動開發諸如恒定時間的zkSNARK prover之類的密碼學原語實現。
二、硬核技術文章一周精選
2、1 zkSNARK 證明優化,將DEX的結算成本降低到每筆交易0.000124美元
在這篇文章中,Loopring首席架構師Brecht Devos解釋了如何通過優化libsnark源代碼,將DEX的總結算成本降低到每筆交易0.000124美元,并使證明者(prover)的成本降低到每筆交易0.000042美元,這一成果較之前的驗證成本降低了大約15倍。
文章鏈接:https://medium.com/loopring-protocol/zksnark-prover-optimizations-3e9a3e5578c0
2、2 干貨 | 一文讀懂比特幣的Taproot/Schnorr升級
在這篇文章中,萬向區塊鏈、PlatON首席經濟學家鄒傳偉介紹了比特幣目前使用的ECDSA 簽名算法,以及即將采用的Taproot/Schnorr簽名升級的技術細節。
文章鏈接:https://www.8btc.com/media/562991
2、3 突破區塊鏈不可能三角(五):閃電網絡,鏈下技術,以及它們的局限性
區塊鏈共識算法學者maxdeath在這篇文章中介紹了閃電網絡的基本原理、HTLC的基本原理,以及這類offchain技術存在的局限性。
文章鏈接:https://www.8btc.com/media/563219
2、4 Substrate極簡版概括:功能、特性與共識
作者DmitriyKashitsyn在這篇文章中介紹了Substrate 框架的主要目標和特性。雖然這還不足以讓你學會編寫相關代碼,但至少可以讓你了解該框架存在的一些優勢。
文章鏈接:https://www.8btc.com/article/560185
2、5 BM最新作:區塊鏈背后的取舍之道
自2009年以來,BM一直在從事區塊鏈技術的研究,他發現,一件有幫助的事是思考人們可以做出的所有設計權衡,這不像“最快”,“最具擴展性”,“最去中心化”或“最佳治理”那么簡單。 在選擇哪種區塊鏈技術最適合你的應用時,本文將探討一些不太常見的問題。
文章鏈接:https://www.8btc.com/article/562686
三、以太坊開發更新進展
以太坊1.X更新內容:
最新無狀態以太坊客戶端研發更新:Witness格式與數據檢索問題;
最新的Nethermind客戶端解決了一些對等節點問題;
以太坊2.0研發更新內容:
關于以太坊2.0的最新知識點科普;
Nimbus客戶端更新:discv5、BLS簽名、輕量級棧跟蹤 ;
火車與旅館EE;
以太坊2.0中的獎懲;
Layer 2 研發更新內容:
Loopring推出基于zk-rollup技術的DEX,初始TPS為100;
幾分鐘內在NodeJS中運行Fuel optimistic rollup;
PlasmaLeap轉向rollups;
本期的分享就到這里啦,下周再見~
責任編輯:ct
評論
查看更多