Red Pulse俞戴龍:區塊鏈專案方面臨的平臺攻擊和防範

安全頻道發表於2020-09-11

平時我們提到區塊鏈都會認為它是非常安全的一項技術,今天我們將要講的安全其和傳統意義上的安全不太一樣。事實上,世界上沒有任何一個系統是安全的,包括區塊鏈也是一樣。Red Pulse作為區塊鏈的專案方,不僅整合了自己原來的生態體系,在我們自身的平臺上也整合了區塊鏈。這裡面任何一環,都會存在非常多的不安全性。Red Pulse作為區塊鏈的專案方在過去都承受了哪些安全性的風險?我們先從數字貨幣行業開始說起。

Red Pulse俞戴龍:區塊鏈專案方面臨的平臺攻擊和防範


過去的幾年,很多加密貨幣交易所都經歷了盜幣的事件。2018年佔據過去幾年的59%,每一年駭客盜取的數字貨幣逐年增大,所佔的比重也很大。

而2019年又有超過整整10億的數字貨幣被盜取,其實區塊鏈本身是安全的,但數字貨幣交易所存在的很多的不安全性會被駭客不斷挖掘出來。

Red Pulse平臺簡介

Red Pulse平臺鼓勵大家在我們的平臺上寫原創文章。大家寫文章後,Red Pulse用區塊鏈的激勵機制給大家一些獎勵。同時Red Pulse把所有在平臺發放的原創文章利用區塊鏈的機制進行版權保護。

概括來說,Red Pulse利用區塊鏈的公開、透明不可篡改的特性。用區塊鏈賦能傳統業務,進行版權保護。

在區塊鏈上,Red Pulse能夠自己寫入智慧合約,並把智慧合約中版權保護的方法稱作Proof of Creation的,可以對使用者在平臺上寫的文章進行版權保護。同時還可以把你的版權轉給其他人(Proof of Ownership),可以產生一些買賣和交易。此外所有的證據鏈條Red Pulse也會將其儲存在區塊鏈上。

在我們最初選擇的過程中,其實有很多區塊鏈可以選擇,譬如比特幣、以太坊,還有些其他的區塊鏈都可以來被用來選用整合到Red Pulse的區塊鏈演算法中。最終我們選擇了非常有名的國有公鏈——NEO。

Red Pulse選用NEO是因為它的速度很快且非常穩定。在整合的過程中主要做的幾點工作進行了相關剖析。無論是選用NEO還是其他區塊鏈,其大體是一樣的。

區塊鏈本身的結構是一個鏈式的分散式全量儲存,像鏈條一樣一環套一環。每一個區塊都有自己的頭部,包含的Parent的雜湊值等資料,加之本身的body資料,來保證整個鏈條是非常完整,且資料是不可以篡改的。我們把它剖析開來可以看到。我們平臺利用區塊鏈就是把作者釋出在Red Pulse平臺上的文章加上可信時間戳,連同Hash一起永久存入區塊鏈上。

我們釋出在NEO區塊鏈上的Token是我們業務發展所必要的在區塊鏈上的載體。我們想把更多的工作重心放在如何將區塊鏈更好的做落地應用,可是事與願違,上線後我們不得不把很多精力分散在Token的安全防護上,下面就來說一說。

因為Red Pulse是整合在區塊鏈的公鏈上,所以在平臺上會支援使用者在平臺上取Token和存Token的過程。

首先看下使用者在Red Pulse平臺取幣過程:使用者來到網站,可以把自己的取幣地址進行輸入並輸入要取的數值。Red Pulse會用輪詢機制發現有使用者要去取款和相關數值到他自己的地址。然後Red Pulse的熱錢包用自己的平臺上的私鑰將其解開。並經過自己的簽名和雜湊,對整個區塊鏈網路進行廣播,然後將使用者的幣轉到對應地址。但這一切都會存在一些不安全性,為了保證安全性,Red Pulse做了大量的工作來保證公司熱錢包不受侵犯。

即便如此仍會面臨很多問題。因為整個系統是部署在亞馬遜平臺上,隨著規模越來越大,也用到了亞馬遜上非常多的系統和依賴。比如會用到EC2、資料庫RDS、S3,與此同時為了分散式自動部署還用到Beanstalk,甚至其他的一些資料倉儲以及無伺服器的架構等都有用到,隨著系統越來越複雜,每一個環節都有可能會被滲透攻擊。所以Red Pulse的上線平臺,除了看自己安全性的最佳實踐之外,還透露了Cloud Front,在第三方整合一個區塊鏈,包括程式碼GitLab。如果系統出現錯誤會傳送到loggly系統和SENTRY進行後續的資料分析。如此來看整個系統變得越來越複雜。

Red Pulse在剛剛上線時相對比較簡單,後端使用django做了一個Rest API。自身有一個NEO的熱錢包,這個熱錢包是整個NEO區塊鏈生態上的一個全節點,該節點和自身背後的django做的後端服務在同一個VPC裡,可以進行內網間互動。所以就透過自己的熱錢包全節點可以做提幣和存幣的功能。

前端相對比較簡單,只需要呼叫後端的API即可,Red Pulse有個APP,還有前端的渲染。還包括我們會有手機端,所有的這些流量都是透過CLOUDFLARE來控制。

我們在2018年很謹慎的上線,上線後看到的第一個問題是看到了很多羊毛黨,因為我們的網站有羊毛可以薅。我們突然就意識到這個世界並不像我們想象的那麼樂觀,而是一上線就被很多人盯上。

為了讓自己的系統變得更加安全,我們想的是更嚴重的問題。比如有人去我們的熱錢包惡意提幣。我們非常嚴格的再回到系統設計裡想一個辦法,讓所有的提幣交易都由我們控制,最終我們想做一個類似Checksum一樣的演算法檢查資料庫發生的和區塊鏈上發生的是一致的。

Checksum第一版本雖然實現起來非常很簡單,但是在有了在Checksum之後,我們工程師對於整個系統安全來說信心就更大了,最容易出問題的錢包這一塊可以很大程度上進行有效控制。

與此同時我們還記錄了實時log。我們想把實時的log打在一個公司的牆壁上。我們找了很多系統但沒有找到特別滿意的,反而我們用slack的效果還是令人滿意的,因為slack就像聊天一樣。我們只需要把所有東西丟到slack裡面,slack本身就是我們公司日常在用的溝通軟體。所以一切東西都可以在slack裡在牆壁上電視機上開一個slack,所有的訊息都丟在裡,所有系統上發生的事情就可以近乎實時監控。

我們又上線一段時間之後,突然發現我們的使用者數在幾天有一次激增的過程。對於我們創業公司來,大家會覺得這種使用者激增是件非常好的事情。但工程師並不這麼想,當時我們還沒做太多宣傳,突然在很短時間出現這麼多使用者我們覺得不太正常。後來我們看了下,這些使用者到底來自哪,他們為什麼要註冊,用什麼郵箱?

隨後發現裡面有一些規律。大多數使用者都是來自東南亞的國家,像越南、菲律賓、柬埔寨等。幾天之內這些使用者用的全部都是Gmail郵箱,而且他們會用一個Gmail郵箱後面去加一個加號,如果大家用過Gmail郵箱會知道,如果在後面加加號,其實都是同一個郵箱,這麼做的目的是為了將來可以實施女巫攻擊。

女巫攻擊就是一個攻擊者可以控制很多賬號,將來會對網站的一些決策做一些影響。那最簡單的一個例子,大家可能去做一些評論,很多人去攻擊一家餐廳,說這家餐廳很難吃,把他的評分降下來,這就是一種常見的女巫攻擊。結合我們網站上的機制,可以很方便的用很多賬號對其中一篇文章全部打五顆星,結合我們的演算法可能會給一些寫的質量很差文章很多獎勵,因為他的星值很高,所以他拿到的獎勵會特別多。我們認為這是一種不太正常的女巫攻擊,雖然他現在什麼都沒有做。但我們也需要做一些防範。

我們的演算法工程師對演算法進行了一些修改。我們會給平臺的使用者一個分數,根據他的貢獻對應的分數再給使用者不同的等級,我們當時用了一個線性方程來做。出現這個事情時候,我們就使用了一些更復雜的演算法,比如用Sigmoid,或者用邏輯迴歸來做。他的好處是剛開始的時候,使用者在平臺上的分數很低,只有當寫了很多高質量文章後才會有比較快速的增長。

也就說在經過平臺一定的考驗之後才會有比較好的分數,才會有比較好的獎勵。這裡面所有的引數都屬於我們控制,將來可以控制女巫攻擊所能攻擊的範圍。同時也可以把第一個月上線時看到的羊毛黨全部找出來。透過他們的特徵將曲線調一調,讓他們無機可乘。

又過了幾個月,我們就看到了更多的屬於區塊鏈的問題,比如假充值。

有一天上班時,我一個同事說,有一個使用者在我們平臺上做了一個存款。但這筆存款一直都沒有到他的賬戶上。如果大家用過這個區塊鏈,就知道在區塊鏈上有一個區塊鏈瀏覽器。說直白一些就是一個對區塊鏈裡所有資料進行檢索的工具。

我們可以把其中的一筆交易打在上面,然後在整個區塊鏈上做一些檢索。如果他真的充值了我們沒發現,只要是在區塊鏈瀏覽器上發現了,就有可能是我們程式的bug。

我把一個交易的id打在一個區塊鏈瀏覽器上,發現確確實實是發生了一筆交易。但在另外一個區塊鏈端瀏覽器上查詢,發現並沒有發生這筆一模一樣的交易,這是一筆空交易或者其實是一個什麼都沒有發生的交易。

左邊和右邊分別是NEO區塊鏈兩個不同的瀏覽器上,這兩個瀏覽器都是官方所支援的,作用也是一樣,都是在區塊鏈的全節點上做檢索,但這兩個表現卻不同,我們檢索了同一筆交易,左邊的Tracker會顯示有一筆賬:某筆交易是從某個地址轉到另一個地址,但在右邊的區塊鏈瀏覽器,上面查無此證,什麼都沒有發生,這個時候我會去想到底發生了什麼。因為如果我們相信左邊確實有一筆充值充到平臺,但根據右邊又什麼都沒有發生,這是一個非常奇怪的問題,因為拜占庭容錯的區塊鏈不可能分叉,即不可能在不同的節點上會有不同的表現。我只能去問NEO官方公鏈的開發來解決問題。為什麼兩個區塊鏈瀏覽器所表現出來的是不一樣的,這筆交易到底有沒有發生。

最後我們得出的結論是:或許這個人找到了一個方法,可以構造出一個交易去騙過區塊鏈瀏覽器,讓瀏覽器相信這筆交易發生了。也就是說區塊鏈的官方瀏覽器可以被騙過,認為這筆交易已經發生。如果我在這個區塊裡就可以開啟那個人的錢包,確實可以看到他有餘額在上面,但用另外一個區塊鏈瀏覽器發現並沒有錢,這筆轉賬是沒有發生的,最後NEO也很快將這個問題進行了修復。

為了更加安全,我們開始做資料的視覺化,可以非常直觀的看到問題。正所謂文不如表,表不如圖。當我們在資料庫裡看資料,很難一眼看明白。但如果將其變成圖表的形式就很方便。如果我們把表格的形式轉換成圖的形式會更加直觀。

我們花了大概一到兩個月的時間將所有在平臺上發生的一切,以資料視覺化的形式展現出來,讓我們非常直觀的知道我們平臺上發生了什麼,有多少個數字貨幣的轉換,有多少取款,有多少存款,有多少寫文章,有多少人得到了多少分。讓整個平臺更加可控。

之後我們碰到了更加恐怖的撞庫攻擊。別人可能利用其他的一些已經洩露的資料庫(資料庫裡可能有使用者名稱和密碼)來登入我們的網站。如果成功了,就可以以別人的身份來登入網站。

我們來看一個例子。有一天同事說,今天網站為什麼開啟那麼慢。因為臨近下班了,我們就把整個伺服器進行了重啟,把資料庫也進行了重啟。過了五分鐘同事又來了,說剛才快了一會兒,現在又慢了。這個時候我們就跑到亞馬遜上看看到底發生了什麼事。

我們可以看到cpu佔了100%。就是說我們的資料庫服務被佔滿了100%的cpu。這是過去從來都沒有發生過的事情。

我們仔細進行了回看,發現cpu並不是永遠都是100%,而是在幾分鐘之前一下從非常低的cpu佔到100%的cpu(如圖)。

我們再從CLOUDFLARE裡去看,我們加了一些JavaScript,加了一個worker,更多的資訊可以先透過worker轉發到自己的ELB裡面,來看到更加詳細的資料。

在kibana裡面,我們蒐集到的資料發現,有一個API被呼叫的次數突然就非常大。在短短几個小時裡達到了566382次的呼叫。而這個API叫做token-auth。我們一眼就知道,這個介面就是我們在登入時所呼叫的介面,這個介面在短短几個小時裡被呼叫56萬次,這一定是一種攻擊,一定有人蓄意對網站進行攻擊。我們就把已經回家的同事全部招回到公司,一起研究這個問題。

透過對資料庫的分析最終確定,這是一次撞庫攻擊,因為我們在資料庫裡發現所有的語句都是類似於:他的使用者名稱是什麼,密碼是什麼,然後透過一個SELECT語句來做撞庫。而這些使用者名稱在我們資料庫裡直接找是找不到的。也就是說並不是一些真實的使用者在嘗試用他們的使用者名稱和密碼登陸我們的網站,而是在用一些根本不存在我們資料庫裡面的使用者名稱嘗試登入我們的網站。

我們首先需要在很短時間先出一個解決方案,這個解決方案非常簡單粗暴。大家可以看到就只有兩行程式碼:

第一句話,我們在python上加了個修飾符,在修飾符裡寫了一個函式。我們規定同一個ip地址,同一個使用者名稱等在30秒內只能呼叫一次,

第二個更加簡單,我們寫了一個sleep函式。當你呼叫完之後,我不返回給你結果。當輸入一個使用者名稱和密碼的組合之後,我們並不把到底是正確還是錯誤的結果返回,故意讓你慢。等20秒後才把結果返回,如果說是真實使用者會抱怨說今天登入怎麼這麼慢。沒關係,我們其他的api速度都很快,只是登入的時候慢一點。但對於攻擊者來說,他每一次都需要等20秒,這極大拖延了他的速度,給我們爭取了很多時間。這兩條語句寫完後,我們的CPU佔用從100%直接降到了20%左右。讓我們有很多時間來解決這個問題。

從另外一個角度,我們可以看到我們記的更多的資料。我們看到使用者大概是用了什麼使用者名稱,大概是用了什麼密碼,當然我們不會去儲存使用者的密碼,我們只是把使用者輸錯時臨時性的把它輸出來。同時我們也從網際網路上下載了幾個已經被洩露的資料庫。我們再把我們得到的資料到內建的資料庫裡邊看。如果可以匹配上,說明攻擊者正在用某一個正在洩露的資料庫來嘗試登入,我們可以直接把這個資料庫在我們平臺上封掉。可惜的是,我們下載的幾個公開的資料庫中並沒有發現相同的資料。

我們發現攻擊者用的國家是新加坡、馬來西亞等。我們先把整個國家的IP全部封掉一段時間來緩解壓力。

所以在哪那幾天如果使用者是從馬來西亞或者是新加坡訪問,都被臨時性的Block一段時間。因為我們發現99%以上的攻擊都來自馬來西亞、新加坡、柬埔寨、越南這幾個國家,都被我們封掉了,給我們爭取更加多的時間。

隨後我們開始尋找應對措施,首先我們登入時需要驗證碼。之前驗證碼過於簡單,可能一個非常簡單的ocr識別就會把它識別出來,所以我們把驗證碼搞得更加複雜一點,譬如算術計算,或者說滑動驗證碼。

第二,把網站上所有的session全部讓他失效,然後強制所有我們覺得有風險的使用者,把他的密碼全部進行加固和修改,改的更加複雜。我們覺得有些人的使用者名稱和密碼已經被攻破。我們就也把他們的密碼改掉,同時給使用者發一個郵件進行告知,如果要改回,可以進入網站進行找回密碼改掉。

第三,強制2FA,駭客用的是靜態資料,用的是使用者名稱和密碼的組合。我們可以用一些動態的手段來確認你的身份。我們可以啟用谷歌2FA的機制。也可以透過使用者註冊手機的短訊息來做2FA,將靜態的東西變成動態的東西來讓他們登入。

第四,制定很多的風險規則,制定Risk Control,同時對取款做了自動關閉的準則。此外前端收集了一些指紋,可以對知道的這些攻擊者進行更徹底的封殺。同時還做了很多例如AI識別等,包括Cloud Flare進行遮蔽等。

接下來是達到的效果,我們把這些都輸出在slack裡面,攻擊者全部被我們偵測到並進行了遮蔽。整個系統的訪問就被擋在外面。

在這段時間之內,非常有名的是幣安發生的問題,當時駭客透過類似的手段,從幣安的系統裡提走了7000個比特幣。

在7月份我們又碰到了一種新的攻擊——社工攻擊(社會工程學攻擊),是目前為止最厲害的一種攻擊手段。我在知乎上搜到了這樣一個帖子。知乎上有人說,社工攻擊已經可以黑掉任何一個網站,任何一個企業,而且社會工程學無處不在。

我們一個客戶提了一個問題,說他取款失敗了,取款並沒有到賬上,但平臺卻說取款已經成功,客戶的語氣非常強硬。那天我去看了這個問題,我去了區塊鏈瀏覽器,把交易ID輸入進入,看到裡面是空的,再到另外瀏覽器上也去看一下發現這裡是有的。當天確實有交易而且應該是成功的,但當我再看下面log時候發現有一些錯誤,我再去看一下他的錢包,看看餘額是多少,發現他的餘額真的是零。我想,有可能這筆交易真的沒發生,所以我們應該把這筆Token再重新傳送一遍給使用者。

為什麼餘額會是零?我們往下拉,發現下面有最近20個交易,記錄顯示我們錢包已經給他轉錢。轉帳之後這個人又把收到的這筆錢轉到另一個地址。所以。這個使用者在對我們客服進行欺騙,他明明已經收到錢而且收到錢之後又把這筆錢轉走。這是一種社會工程學攻擊,是在欺騙我們的客服。

其實社會工程學的案子很多,以前我經常會講一個例子,我當時我當時冒充一個manager,說我給你發一個連結,我在測試這個東西,你幫我去點開一下。但這個連結中我已經植入了一些指令碼,我會透過指令碼把你的一些session等全部都蒐集下來,而且發郵件是可以匿名的,所以我可以以任何人的名義,甚至以他們公司郵箱的名義發郵件。可想而知,大家如果收到這樣的郵件,一定會點開連結。一旦點開這個連結,很多東西就都被我盜走,這也是一種社會工程學。所以說社會工程學無處不在。

隨著我們平臺上覆雜度的增加,我們平臺上經歷了各種各樣的問題,我們發現以前的資料視覺化遠遠不夠。

後來我們花了更多的維度剖析我們網站上發生的事情,發生了什麼?在哪裡發生的?從多個維度分析來確保平臺至少在資料層面是安全的。花了很多的公司,甚至還組建了Data team來做相關工作。

隨後,我們還找了知道創宇、慢霧等第三方公司來幫我們一起來看我們網站裡還有哪些問題,還是發現了很多非常嚴重和高危的漏洞。所以其實在我們平臺上線之後,碰到了各種各樣的攻擊,攻擊是無處不在且一直持續在發生。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545812/viewspace-2718946/,如需轉載,請註明出處,否則將追究法律責任。

相關文章