Tor The Second-Generation Onion Router學習筆記


前半部分是看油管上一些視頻對Tor的初步認識,后面是根據論文記得一些筆記,基本上是直接翻譯,添加了一點術語解釋。

Tor The Second-Generation Onion Router

1.Tor簡介

Tor是一種基於電路的低延遲匿名通信服務,2代Tor通過添加完美的前向匿名、擁塞控制、目錄服務器、完整性檢查、可配置的退出策略以及通過聚合點實現位置隱藏服務的實用設計來解決原始設計中的限制。

Tor設計目標:①以較大的可變的延遲來實現匿名化;

②易於分析,但用戶必須信任匿名代理;

③任何結點都可以讀取用戶流量;

④廣播響應來隱藏發起者。

Tor工作原理:Alice->Bob

①Alice的Tor客戶端從目錄服務器中獲得一系列的Tor結點;

②Alice的Tor客戶端選擇一條隨機的到目的服務器的路徑,這其中Alice到Tor結點和Tor結點之間 的消息傳遞都是加密的,Tor結點到Bob的一段是非加密的;

③若之后Alice又對其他節點進行訪問,其客戶端會根據以上流程進行傳輸。

Tor通過三層加密來確保信息安全,Tor網絡中的結點均是來自世界各地的志願者結點,並且,網絡中的結點越多,Tor的匿名性就越強。

傳統的加密方式是圍繞信息本身進行加密,但是有時我們甚至不想讓人知道自己做出了發信息這一行為,也就是實現完全匿名。

Tor的一次信息傳遞需要經過三跳,經過三個中間結點。

Tor中的每個結點都知道自己的前驅結點和后繼結點,沒有一個結點對整個網絡一無所知。

2.Tor原理簡述

Tor客戶端發出的信息經過三次加密,分別對應密鑰K1、K2、K3,message被層層包裹在內部,形狀很像洋蔥。

 

 

在上圖的傳輸過程中,Node2無需也不會得知消息的發送者是誰,Node2只需要知道這是一條應該被轉發給Node3的信息,將其的K2加密層去除之后,Node2將包轉發給Node3.

上述的這種特性使得即使有人成功地攻擊了某個路由結點,那么攻擊者也無法獲得整個路徑的信息,從而起到了對個人信息的保護作用。

這種傳輸方式的壞處在於勢必會影響信息的傳播速度,並且很依賴志願者結點的數量以及鏈路的質量。

假設對圖中的①②③④分別進行嗅探,會出現的情況:

①有人在訪問Tor網絡,在干什么不知道;

②/③完全不可讀的加密信息;

④一些訪問行為,但是這些行為的發起者是誰不得而知。

上述過程中,①②③都是加密的。

但是如果我們同時監控了①④兩處的流量,或許可以從中分析出一些信息,這也是Tor研究的一個重要方向——流量分析。一種方式是以大量的、帶有時間戳的流量訪問入口結點,並且在出口結點進行監聽,分析其中的關聯關系。

需要注意的是,和上圖所示的洋蔥結構的直觀感覺不同,Tor Node在進行解密時不會對message本身的大小進行改變,這也是Tor設計的巧妙之處之一。因此整個Tor網絡中的任意結點之間的包在大小和格式上都類似於其他的包,起到了偽裝作用。

3.Tor設計

Tor網絡是一個覆蓋網絡;每個洋蔥路由器(OR)作為一個普通的用戶級線程進行,沒有任何特權。每個洋蔥路由器和其他的洋蔥路由器都保持一個TLS連接,每個用戶運行一個成為洋蔥代理(OP)的本地軟件來從目錄服務器獲取目錄,建立跨網絡的電路,並且處理來自用戶應用程序的連接。這些洋蔥代理接受TCP流並在電路中對其進行多路復用,另一端的洋蔥路由器連接到TCP流的目的地並中繼數據。

(術語解釋:

①覆蓋網絡Overlay Network:簡單來說就是應用層網絡,面向應用層,不考慮或者很少考慮網絡層和物理層的問題,允許對沒有IP地址表示的目的主機路由信息。

②安全傳輸層協議TLS:用於在兩個通信應用程序之間提供保密性和數據完整性,該協議由兩層組成:TLS記錄協議和TLS握手協議。TLS協議采用主從式架構模型,在兩個應用程序之間透過網絡創建安全的連接,防止在交換數據時受到竊聽和篡改。TLS協議不能直接地歸於某個單獨的通信層,TLS運作基於一些提供可靠通信的傳輸層協議(例如TCP),這意味着其在傳輸層之上;同時它也向更高層的通信協議提供加密服務,這項工作在OSI中通常屬於表示層協議。但是應用程序通常將TLS協議作為傳輸層協議對待。)

每個OR維護一個長期身份密鑰和一個短期洋蔥密鑰,身份密鑰用於簽名TLS證書、簽名OR的路由器描述符,以及通過目錄服務器簽名目錄;洋蔥密鑰用於解密用戶建立電路和協商臨時密鑰時的請求,在OR之間進行通信時,TLS協議還會建立一個短期鏈路密鑰,短期密鑰會獨立、周期性地輪換,來限制密鑰泄漏的影響。

3.1洋蔥單元

OR通過帶有臨時密鑰的TLS連接相互通信,並且與用戶的OP通信,使用TLS以完美的前向保密方式隱藏鏈路上的數據,並且防止攻擊者修改線路上的數據或者冒充洋蔥路由器。

(術語解釋:前向保密:也稱完美前向安全perfect forward secrecy,是密碼學中通訊協議的安全屬性,指長期使用的主密鑰泄漏不會導致過去的會話密鑰泄漏。通俗地說,假設一個長期密鑰泄漏了,雖然以后的行為的保密性無法確保,但是之前的行為的安全性是可以保證的,敵手獲得了當前你的密鑰,但是他無法成功偽造一個過去的簽名。一般的實現方法是固定公鑰,而密鑰隨着時間更新,這個更新過程是單向無循環的,這就可以保證歷史密鑰的安全性)

 

 

Tor流量由固定為512字節的單元組成,每個單元都由頭部和負載組成。頭部包括一個電路標識符circID(指定單元引用哪個電路,多個電路可以通過單個TLS電路進行多路復用)、CMD(描述如何處理單元的負載)。電路標識符是鏈接特定的:每個電路在其所遍歷的每個OP-OR或OR-OR鏈接上都有一個不同的電路標識符。根據單元頭的CMD,單元要么是控制單元(總是由接受他們的結點進行解釋)要么是中繼單元(攜帶端到端流數據)。CMD的種類有:padding、創建電路、設置新電路、摧毀電路。

 

 

中繼單元(上圖)在單元頭之后有一個附加的中繼頭,包含一個流標識符(用於多個流在電路上復用時的區分)、用於完整性檢查的端到端的校驗和、中繼有效負載的長度Len、一個中繼命令CMD。中繼單元在電路上傳輸時,使用128位AES密碼在計數器模式下生成密碼流,將中繼頭的全部內容和中繼單元負載一起加密和解密。

(術語解釋:AES加密算法:高級加密標准AES,是最常見的對稱加密算法,加密和解密需要使用相同的密鑰。作為分組密碼,AES將明文分成長度相等的組,每次加密一組數據,直到整個明文加密完成。AES規定分組長度只能為128位,密鑰的長度有128位、192位或256位幾種,常用的是AES-128。具體過程再做筆記吧)

3.2電路和流

洋蔥路由最初為每個TCP流建立一個電路,由於公鑰加密和網絡延遲,這個工作需要耗費大約十分之一秒的時間。在Tor中,每個電路都可以被多個TCP流共享,為了避免延遲,用戶預先構造電路,若之前的電路已經被使用,用戶的洋蔥代理會定期建立一個新電路,並對不在有任何開放流的舊電路進行過期處理。OPs每分鍾建立一次新電路,因此即使是大量用戶也會花費微不足道的時間來構建電路,通過給定出口的結點,有限數量的請求可以相互連接。此外,由於電路是在后台構建的,OPs在創建電路失敗時可以及時恢復,而不是延遲流,這樣會損害用戶體驗。

3.2.1電路的創建

 

 

①名為Alice的OP為了創建一個新的電路,發送一個數據包到她選擇路徑的第一個結點(Bob),這個數據包的circID是新的,沒有在其與Bob的連接中使用的。創建數據包的有效負載中包含了Diffie-Hellman握手g^x1的前半部分;

②Bob的響應是創建了包含DH握手后半部分的數據包,以及協商之后的key值。這時,電路就已經建立起來了(在這一步中,Bob證明是他收到了g^x,並且選擇了y);

③為了進一步擴展電路,Alice發送中繼擴展單元給Bob,指定下一個OR的地址(Carol),並為其加密了g^x2;

④Bob將這個半握手復制到一個數據包內,然后傳遞給Carol,使電路向下延伸(Bob選擇了一個新的circID),這里Alice不需要知道Bob和Carol之間的circID,將Alice和Carol聯系在一起的只有Bob;

⑤Carol用創建數據包相應電路擴展請求,Bob將其有效負載封裝到中繼擴展數據包中,傳回Alice,告知Alice電路已經擴展到Carol(現在電路擴展到Carol,Alice和Carol共享一個key K2=g^x2y2,若還需擴展電路,Alice會重復上述的過程);

3.2.2中繼數據包

Alice建立電路之后(Alice和電路上的每個OR都共享密鑰),她就可以發送中繼數據包。每個中繼數據包都有一個流ID來表示其屬於哪個流。在接收到一個中繼數據包之后,OR根據流ID查找相應的電路,並用該電路的會話密鑰來解密中繼頭和負載。若中繼數據包是由Alice發出的,OR會檢查解密之后的流是否被識別出來,它要么是對應於給定電路的這個OR處的一個打開的流,要么是一個控制數據包(streamID zero)。如果OR識別出了streamID,它會接受這個中繼數據包並且按下面的流程處理,否則,OR會查找電路中下一跳的circID和OR,將circID酌情替換,並將解密的中繼數據包發送給下一個OR(若電路末端的OR接收到一個無法識別的中繼數據包,則認為發生了錯誤,該中繼數據包將被丟棄)。

OP對於傳入的中繼數據包:使用電路上每個OR共享的會話密鑰迭代地打開中繼頭和負載,若OP在任何階段接收到了中繼數據包,那么它必定起源於最近剛剛解除加密的OR。

為了構建一個定位到目標OR的中繼數據包,Alice需要用到達該OR的每一跳的對稱密鑰迭代加密數據包。在這個過程中,每一步都將streamID加密為不同的值,因此只有在目標OR處,才會是一個有意義的值。這種有漏洞的(能隨時下車的)網絡拓撲設計允許Alice在單一電路的不同OR退出,Alice可能會因為退出策略選擇不同的退出點,或者讓OR不知道兩個流來自同一個人。

為了拆除一個電路,Alice發送一個破壞數據包,電路中的每個OR接收到之后會關閉該電路上的所有流,並向前傳遞一個新的破壞數據包。正如電路是逐步建立起來的,它也可以被逐步拆除:Alice發送一個中繼截斷數據包到電路上的每個OR,這個OR接下來會發送一個破環數據包,並通過中繼截斷數據包來確認。

Alice可以將電路擴展到不同的結點,而不需要向中間結點發出信號來表示她已經改變了電路。若電路上一個結點出現了故障,它也可以向Alice發送一個中繼截斷數據包,這樣,“斷開一個結點,觀察哪條電路斷開”的攻擊方式就被削弱了。

3.2.3打開和關閉數據流

當Alice的應用程序需要一個到給定地址和端口的TCP連接時,它請求OP通過socks建立連接,OP選擇一條新的電路(或者根據要求建立一條),並在電路上選擇一個合適的OR作為退出結點(這個結點通常是最后一個結點,但是可能由於退出策略沖突而選擇其他結點)。OP使用新的隨機身份標識符向出口結點發送中繼開始單元來打開流。出口結點連接到主機之后,它會向OP回復中繼連接單元,OP收到后發送socks回復通知應用程序連接成功。之后,OP接受來自應用程序TCP流的數據,將其打包到中繼數據單元中,將這些數據單元沿電路發送到之前建立連接的OR。

Tor數據流的關閉類似於TCP流:對正常操作使用兩步握手,對錯誤操作使用一步握手,若流異常關閉,流上相鄰的結點會簡單地發送中繼拆除單元;若流正常關閉,結點向電路發送一個中繼終止單元,當另一方發送回自己的中繼中斷單元時,流就可以關閉。因為所有的中繼單元都使用分層加密,所以只有目的地結點知道這個中繼單元是一個關閉流的請求。這兩步握手允許Tor支持基於TCP的使用半關閉連接的應用程序。

3.2.4流的完整性檢查

舊的洋蔥路由設計使用了沒有完整性檢查的流密碼,其流量很容易受到可延展性攻擊(盡管攻擊者不能解密數據包,但是對加密數據的任何更改都會對離開網絡的數據產生相應的更改),這個弱點允許對手將填充數據包更改為破環數據包;或者將中繼開始單元中的目的地址修改為對手的網絡服務器,等等。任何能夠猜到加密內容的對手都可能在流中引入這種破壞。

Tor在其鏈路上使用了TLS,其完整性檢查保護數據不被外部對手修改,但是,解決內部可塑性攻擊則更為復雜(?)

我們可以通過包含哈希值或使用一些驗證密碼模式來在每一跳對中繼單元進行完整性檢查,但是這存在一些問題:首先,這些方式都會增加每一跳的消息擴展開銷,因此我們要么泄漏路徑長度,要么就要將所有的中繼單元都填充到最大長度,這會造成字節浪費;其次,這些解決方案只能對來自ALice的流量進行驗證,由於電路上的OR不知道其他OR的會話密鑰,因此OR不能為中間跳產生合適的哈希值(這里可能是說,對電路上所有OR的會話密鑰都知道的只有電路的建立者ALice);第三,我們已經承認我們的設計容易受到端到端的定時攻擊,那么標記電路內執行的攻擊不會給攻擊者提供額外的信息(這里可能說的是前面提到的大量帶時間戳的流量分析攻擊)。

考慮到上面的情況,Tor僅在每條電路的邊緣進行完整性檢查(之前提到,Tor電路是類似於漏管的電路,因此電路的邊緣可以是電路上的每個OR)。

當Alice在和新一跳協商密鑰時,他們各自用該密鑰的導數初始化一個SHA-1摘要,從而從只有他們倆知道的隨機性開始。從這時起,他們每個都遞增地將他們創建的所有中繼單元的內容添加到SHA-1摘要中,並在每個中繼單元中包含當前摘要的前四個字節,每個還保留一個SHA-1的接收數據摘要,來驗證接收到的哈希是正確的。

為了達到之前提到的修改或刪除(攔截)電路中的一個中繼數據單元,攻擊者必須能夠推斷出當前的摘要狀態(這取決於Alice和Bob之間的所有流量,從他們一開始協商的密鑰開始)。在對SHA-1的攻擊中,對手可以逐漸增加到一個哈希值來產生一個新的有效哈希值,但是這種攻擊是無效的,因為所有的哈希值都是在整個電路中端到端加密的。對手猜出有效哈希的概率是低到可以接受的,若Alice或Bob收到一個壞的哈希值,那么電路就會被及時關閉。

3.2.5速率限制和公平

Tor服務器使用令牌桶方法來強制傳入字節的長期平均速率,同時仍然允許超過允許帶寬的短期突發。因為Tor協議生成的出站字節和進入字節大致相同,因此只需要限制一個就行了。

(術語解釋:令牌桶算法:一種常用的流量測量方法,令牌桶指的是網絡設備的內部存儲池,而令牌則是以給定速率填充桶的虛擬信息包。令牌桶有預設的容量,滿時,多余的令牌溢出。需要注意的是,令牌桶中存放的不是消息報文,而是令牌。單純的令牌桶只是流量測量方法,對流量進行過濾、丟棄等其他操作是由其他功能完成的。)

3.2.6擁塞控制

盡管有了速率限制策略,我們還是要考慮擁塞的情況,無論有意還是無意,若有足夠多的用戶為他們的電路選擇相同的OR-to-OR連接,該連接很快就會達到飽和。例如,攻擊者可以通過Tor網絡向他運行的網絡服務器發送一個大文件,然后在電路的網絡服務器段拒絕讀取,若沒有擁塞控制機制,這些數據包會通過整個網絡傳播回來。下面是我們的策略:

①電路級擁塞控制:為了控制電路帶寬使用,每個OR跟蹤兩個窗口:打包窗口跟蹤OR被允許打包多少中繼數據單元(從傳入的TCP流)以傳輸回OP;傳遞窗口跟蹤它願意將多少中繼數據單元傳遞到網絡外的TCP流。每個窗口都被初始化,在數據單元被打包或交付時,相應的窗口將減小。當一個OR接收到足夠的數據單元時,其向OP發送中繼發送單元,流標識符為0.當OR接受到流標識符為0的中繼發送單元時,它增加其打包窗口。若封裝窗口到達0,OR停止從TCP連接中讀取相應電路上的所有流,並不再發送更多的中繼數據單元,直到收到一個中繼發送單元。OP的行為和OR是相同的,除此之外OP還必須跟蹤電路中的每個OR的封裝和交付窗口,若封裝串口到達0,它將停止從發送給該OR的流中讀取數據。

②流級擁塞控制:OP和OR通過發送單元實現對電路中的各個流的端到端流控制。每個流以一個打包窗口開始,並在接受中繼發送單元時將該窗口增加一個固定值。流級擁塞控制還必須檢查數據是否已成功刷新到TCP流,而不是總是在到達足夠的單元后返回中繼發送單元,它只在等在刷新的字節數低於某個閾值時才發送中繼發送單元。

3.2.7集合點和隱蔽服務

集合點是Tor網絡中位置隱藏服務(也稱響應者匿名)的一個組成部分。位置隱藏服務允許Bob提供TCP服務而不透露其IP地址,這種類型的匿名保護了分布式Dos攻擊(攻擊者被迫攻擊Tor網絡),因為他們不知道Bob的IP地址。

位置隱蔽服務的設計目標:

①訪問控制:Bob需要一種方法來過濾傳入的請求,這樣攻擊者就不能僅僅通過和Bob建立許多無意義的連接來攻擊他;

②健壯:Bob應該能維持一個長期的假名身份,即使在出現路由器故障的情況下;

③防污跡:一個社會攻擊者如果提供了一個非法的或者聲名狼藉的位置隱藏服務,就不應該通過讓觀察者相信是路由器創建了這個服務來陷害一個約會路由器(這沒看懂什么意思);

④應用程序透明:雖然我們要求用戶運行特殊的軟件來訪問位置隱藏的服務器,但是我們不能要求他們修改他們的應用程序。

我們允許Bob將幾個洋蔥路由器作為聯絡點來為他提供位置隱藏,他可以在任何具有經過身份驗證的健壯高效的鍵值查找系統上坐到這一點。客戶端Alice選擇OR作為她的集合點,她連接到Bob的一個介紹點,告知Bob她的集合點,接着等待Bob來自己的集合點連接。這種額外的間接層可以幫助Bob的引入點避免與直接提供不受歡迎的文件相關的問題(類似於隔離的作用?)。還允許Bob相應一些請求,並忽略其他的請求。

4.其他設計決定

4.1資源管理和拒絕服務

將Tor作為公共服務給網絡帶來了許多拒絕服務攻擊的機會,雖然有了流量控制和速率限制策略來阻止用戶消耗超過路由器所願意提供的帶寬,但用戶仍然有機會消耗超出其公平份額的網絡資源,這可能會導致網絡中的其他人無法使用。

(術語解釋:拒絕服務攻擊:攻擊者想讓目標機器停止服務,是常用的攻擊手段之一。比較典型的就是針對網絡帶寬進行的消耗性攻擊。幾種拒絕服務攻擊實際上都是想實現兩種效果:①迫使服務器的緩沖區滿,使其無法再接受新的請求;②使用IP欺騙,迫使服務器將非法用戶的連接復位,影響合法用戶的正常連接)

首先,有幾種消耗cpu的拒絕服務攻擊,攻擊者使用這種攻擊迫使OR執行昂貴的密碼操作。類似地,攻擊者可以偽造TLS握手的起始,迫使OR執行TLS握手的另一半,而攻擊者實際上沒有計算成本。

我們還沒有實現對這些攻擊的任何防御,但是有幾種可能的方法:首先,OR可以要求客戶端在開始新的TLS握手或接收創建單元時進行令牌驗證,只要這些令牌易於驗證並且生成的計算成本較高,就可以達到對攻擊的限制目的。此外,OR還可以限制它們接受創建單元和TLS連接的速率,但是這種速率限制可能會讓攻擊者在其他用戶創建新電路時減慢其速度。

4.2退出策略和濫用

每個洋蔥路由器的退出策略都描述了路由器將連接到哪些外部地址和端口。OR也可能能夠對客戶端進行身份驗證防止退出濫用而不傷害匿名。

4.3目錄服務器

Tor使用一小群冗余的、知名的OR來跟蹤網絡拓撲和結點狀態的變化,包括密鑰和退出策略,每個這樣的目錄服務器作為一個HTTP服務器,因此客戶端可以獲取當前的網絡狀態和服務器列表,OR也可以將其狀態信息上傳到目錄服務器。OR定期向每個目錄服務器發布其狀態的簽名,目錄服務器將這些信息和他們自己的網絡視圖結合起來,生成整個網絡狀態的簽名描述(目錄)。

5.攻擊和防御

5.1被動攻擊

①觀察用戶流量模式:觀察用戶連接不會顯示其目的地或數據,但是可以得到流量模式,通過用戶連接模式進行分析需要進一步的處理,因為多個應用程序流可能在同一個電路上串聯運行。

②觀察用戶內容:雖然用戶端內容是加密的,但是和應答者之間的連接可能不會加密,實際上,應答者的網站本身可能就是敵對的。雖然過濾內容不是洋蔥路由的主要目標,Tor可以直接使用Privoxy和相關的過濾服務來匿名化應用數據流。

③選擇可區別性:我們允許客戶端選擇配置選項。例如,有的用戶可能相對於可追溯性,更關注請求鏈接性,因此這些客戶可能會更加頻繁地更換電路,這部分用戶可能會因此顯得與眾不同而失去更多的匿名性。

④端到端時間相關性:Tor只能最低限度地隱藏這種相關性。攻擊者觀察在發起者和響應者的流量模式將能夠以高概率確認通信。目前最有效的防止此類確認的保護措施是隱藏洋蔥代理和第一個Tor結點之間的連接,可以在Tor結點上或是在防火牆后運行OP。這種方法需要觀察者將來自洋蔥路由器的流量和經過洋蔥路由器的流量分開,全局的觀察者可以做到這一點。

⑤端到端大小相關性:簡單的包計數也可以有效地確認流的端點。然而,即使沒有填充,我們也有一些有限的保護:漏管模型意味着不同數量的數據包可能會進入電路的一個端點(OR),而不是其他的OR。

⑥用戶指紋:這種攻擊通過嘗試分析用戶在訪問瀏覽器時的習慣來進行分析攻擊。

5.2主動攻擊

①妥協的密鑰:得知TLS會話密鑰的攻擊者可以看到該連接上的每個電路的控制單元和加密的中繼單元;得知電路會話密鑰可以讓他解開加密的一層。一個攻擊者如果得知了某個OR的TLS私鑰,就可以在TLS私鑰的生命周期內模仿這個OR,但他還必須得知洋蔥密鑰來解密創建單元,並且,由於完全的前向保密,攻擊者無法在不損害其會話密鑰的情況下劫持已經建立的電路。周期性的變換密鑰會限制這些攻擊的機會窗口。另一方面,攻擊者一旦掌握了結點的身份密鑰,就可以向目錄服務器發送新的偽造描述符來無限期地替換該結點。

②迭代妥協:一個可以危及OR的對手可以沿着危及結點的回路行進,直到他到達終點。然而,除非對手能夠在電路的生命周期內完成此次攻擊,否則OR將在攻擊完成之前丟棄必要的信息。

③運行一個服務器:對手可以運行一個服務器並誘導用戶連接到他們的服務器上(可能是通過投放廣告的形式),那么對手現在就掌握了鏈接的一端。

④運行一個洋蔥代理:終端用戶幾乎總是運行他們自己的本地洋蔥代理,然而在某些設置中,代理可能需要遠程運行,損害一個洋蔥代理將損害將來所有通過它的連接(沒看懂)。

⑤攻擊未被觀察到的結點:一個只能監視Tor網絡的觀察者可以通過攻擊沒有被觀察到的結點來增加這個流量的值,進而關閉他們,降低他們的可靠性,或者讓用戶相信他們是不值得信任的。

⑥運行敵對的OR:敵對的結點可以通過自身創建電路或者改變流量模式來影響其他結點的流量。

5.3目錄攻擊

破壞目錄服務器:如果有一部分目錄服務器遭到攻擊消失,其他服務器仍然可以確定一個有效的目錄,只要有任何的目錄服務器正在運行,它們仍將生成一致的目錄並廣播對網絡進行觀察。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM