2011-02-01 20 views
8

在我的公司,我們正在開發一個由多臺服務器組成的大型系統。該系統由約5個邏輯組件組成。數據存儲在XML,MS SQL和SQLite中。這是一個.Net系統(主要),組件使用WCF和一些自定義UDP進行通信。 客戶端主要通過自定義UDP或WEB訪問系統(ASP.NET & Silverlight)。保護部署在「惡意」環境中的系統

保護通信很容易,一些SSL和WCF上的一些安全性,我們完成了。

我們面臨的主要問題是系統需要部署在客戶端的網站上,這是我們不一定信任的客戶端。我們需要捍衛服務器上的數據,以及逆向工程中的軟件本身。兩者對我們都非常重要。

此外,我們需要一個殺死開關,我希望某些東西可以根據命令破壞數據和軟件,或者如果無法在一定時間內致電回家。

我想到的方向是使用TPM或類似的東西 - 一些硬件加密解決方案,與另一種服務相結合,我們可以在內部保留這些服務以加密服務器上的所有軟件和數據,以便密鑰的意願來自我們的服務器安全地在我們的網站,並可能從TPM的內存窗簾。

你如何解決這個問題?


UPDATE 04/02 我在尋找切實可行的建議,或產品,可以幫助我建議,所以我開始賞金......

看傢伙我們基本上把我們的機器放在客戶的網站上(出於商業和實際的原因),我們擁有這臺機器,客戶在幾個小時內收到他所付的一切,他可以隨心所欲地處理數據。但是我在那臺機器上運行的算法,以及存儲在那裏的一些數據是我們想要保護的商業祕密。 理想情況下,我希望機器不工作,甚至不開機,如果我不說,這是好的,沒有我的確定在機器上的一切保持加密。內存遮擋看起來也是在執行時保護機器的好方法。

理想情況下,我希望HD和所有機器上的存儲器一旦有人用螺絲刀接近它們就會爆炸...... :-)但我認爲這會花費太多......


UPDATE 10/02 OK在做了一些研究之後,我認爲我們會嘗試一些與PS3加密系統相同的方向,除了我們要帶來解密軟件和我們服務器數據的密鑰。這樣做,我們可以決定我們的機器是否信任請求密鑰的服務器,我們可以通過重新設置機器來獲得kill switch。這可能是基於TPM或類似的東西,也許英特爾的TXT ... 我也真的有興趣在內存窗簾作爲一項重要的安全功能...

順便說一句,我們不能通過移動有價值的零件我們的系統到我們的網站,無論是因爲業務需求,還是因爲它不具備技術上的可行性 - 我們需要巨大的帶寬......

+0

爲使討論更有意義:您認爲攻擊者會將什麼樣的努力放到您的系統中? (像租用一個集羣,僱用10名安全研究員,每小時100美元,爲期一個月,或類似) – wizzard0 2011-02-10 21:59:01

+0

> PS3加密系統 >業務需求 >巨大的帶寬.... 另外,我見過一個系統這樣的要求。在源代碼中。與銀行業務有關。所以,實踐起來,我可以幫你設計它(不是真的相信你可以聘請一個完整的陌生人,但是)。 – wizzard0 2011-02-10 22:04:53

回答

10

你要求,實際上是什麼,是求之不得的。這大致相當於遊戲控制檯的功能,您可以在不受信任的環境中運行可信平臺。

考慮你是否可以把機器從1日遭到損害如果你能這樣的假設下工作,那麼事情就變得對你相當容易,但是,這並不可怕的聲音在這裏存活。

在實際上保證它而言,有幾個顧慮:

  • 您必須加密文件系統和使用硬件解密
  • 您必須彼此隔離應用程序,所以在一個安全問題不妥協別人
  • 您必須規劃發生安全問題,這意味着把減災戰略就像一個安全的虛擬機管理程序到位

我知道這些都是相當含糊的,但這真的是過去幾年遊戲機保護的歷史 - 如果您對這種解決方法(和破解)感到好奇,請向控制檯製造商尋求幫助。

這是從來沒有完全成功地做到,但你可以顯著提高進入的門檻。

+0

我無法將機器視爲受損。我正在尋找相反的方法。將機器視爲安全,並在其損壞後立即處理。基本上我正在尋找類似於遊戲控制檯上存在的東西,但對於企業服務器來說,並且要嚴格得多。而且我的遷移策略會在我認爲已經受損的情況下徹底殺死機器。 +1順便說一句,以便了解如何在遊戲控制檯上完成這些內容。 – 2011-02-04 13:21:24

4

...說實話,聽起來好像你在問怎麼把病毒寫入你的應用程序,這讓我認爲你的客戶可能有更多的理由不相信你而不是相反。

話雖這麼說,這是有很多原因一個可怕的念頭:

  1. 如果他們的互聯網連接 死亡或他們移動辦公 和斷開機器的 位會發生什麼?
  2. 如果你的代碼錯了,它會怎樣? 失火?刪除數據,即使 客戶正確使用它?
  3. 我只能假設你的請求 意味着你的應用程序提供 沒有備份功能。我的 是否正確?聽起來就像我不會購買的 產品。
  4. 您的 應用程序管理的數據有多寶貴?如果是 刪除了什麼樣的金融 這會導致客戶的損失?您的法務部門已經 簽收了 這並驗證您不能持有 責任?
+0

首先,我不確定我是否需要一個關閉開關,我認爲提供關鍵碼來打開我們服務器上的所有內容就足夠了......第二個客戶端收到他在幾個小時內收到的所有內容,只要我們完成處理,我們正在銷售服務而不是軟件。客戶希望我們將實施服務的服務器放在網站上,我不希望他們有權訪問我們實施服務的方式。第三,如果你沒有提高生產力,那麼請避免自己。 – 2011-02-01 21:43:23

4

這個問題每週2-3次提問,答案總是一樣的 - 無論你給用戶的是不是你的。

您可以讓用戶更難獲取數據,但您無法完全阻止他到達目的地。您可以對數據進行加密,您可以將解密密鑰保留在USB cryptotoken(不公開密鑰)上,但理論上如果代碼可以調用cryptotoken並要求它解密數據塊,那麼黑客可以複製你的代碼(理論上),並使這個代碼調用cryptotoken來解密所有數據。

實際上,任務可能會變得很複雜,以至於無法獲取數據。此時您應該檢查,解密數據對用戶來說真的有多重要。

關於殺死開關:這是行不通的。決不。如果需要,用戶可以製作副本並從備份中恢復。他可以更換電腦時鐘。他甚至可能放慢計算機的時鐘速度(如果數據非常有價值,那麼投資到自定義仿真硬件是可行的)。

關於關鍵數據:有時會發現您的寶貴資產對其他任何人都沒有多大價值[並且您的解決方案的其他方面是]。例如:我們提供我們的驅動程序產品的源代碼。這對我們來說是最寶貴的資產,但用戶不是爲代碼行付錢,而是爲了獲得支持,更新和其他好處。用戶將無法有效使用[偷來的]源代碼而不用投入金額,這與我們的許可證的成本相當。

關於混淆:代碼片段(例如.VMProtect產品)的虛擬化似乎非常有效,但它也可以通過一定的努力繞過。

一般而言,我可以考慮使用定製操作系統的一些定製硬件,像自動取款機一樣密封(以便客戶無法進入而不打破封條),定期檢查等。這可能有效。所以這個任務不僅僅是技術性的,而且主要是組織性的 - 你需要定期檢查機器等。

總結:如果數據價值,保持您的服務器上,並只提供互聯網連接。否則,您只能將風險降至最低,而不能完全避免。

+0

這個軟件對我們來說更重要,那麼數據呢,我們又一次試圖捍衛整個盒子。不是客戶端機器上的軟件,它是我們的機器,我們擁有它。 – 2011-02-04 13:05:08

+0

@Hellfrost密封盒子並實現自定義GUI,不會讓用戶獲得管理員訪問系統的權限。並定期檢查印章。 – 2011-02-04 14:57:50

1

「有一個完全安全的系統的唯一方法是用錘子打破它」

這就是說,它可以有足夠的想成爲黑客螺絲,使之更麻煩比它的價值。如果機器是一個'黑匣子',他們不能直接訪問它,而是有處理它的程序,那麼你最大的威脅就是物理訪問。您可以鎖定箱子,甚至可以將一個小巧的易碎物品安裝到箱子中,如果箱子被打開,它會被折斷......確保您的服務人員總是更換這個物品......它會讓您知道某人是否已經打開它沒有授權(是的,這是一箇舊的青少年技巧,但它的工作原理)。至於盒子本身,在物理上禁用任何您不需要的硬件(如USB端口)。

如果你正在處理一個機器,是不是一個黑盒子,加密了地獄的一切...... 256位加密實際上不可能沒有密鑰破解......然後的伎倆變得越來越關鍵。

從理論上講,你可能有關鍵變化(通過重新加密的數據),並只能由直接與您的(安全)服務器通信的過程中檢索。

此外,追蹤一切發生的變化中,尤其是發生在正常使用的情況,軟件什麼。這在很大程度上不能保護你從別人誰是真的,真的確定......但它可以通知您,您的系統已經被入侵。 (你可以起訴任何人破門而入)

至於殺死開關......好吧,睡眠病毒在那裏,但正如已經說過的,他們可能會被愚弄或偶然發生。我會建議,如果你懷疑違規,系統會用隨機生成的密鑰加密一切,然後把密鑰發送到你的服務器(這樣你就可以撤銷破壞),而不是把它自己擦乾淨,然後'撕碎'用來包含密鑰的文件。 (多種文件粉碎機在那裏可能會破壞數據不夠好,這是(幾乎)不可能恢復。)

2

正如其他人說,沒有靈丹妙藥。用戶可以關閉機器,將HD作爲其他機器的奴隸,備份所有內容,反向引導您的代碼,然後成功破解它。一旦用戶對可執行文件進行了物理訪問,它可能會受到影響,並且無法在100%的情況下將其停止。

你能做的最好的就是讓潛在的黑客工作辛苦得要命,不過無論你做什麼,它不會是牢不可破的。

中的一些錯誤的情況下使用的自我毀滅可以圍繞由backup'd一切裂解裝置進行加工。

在USB驅動程序中使用密鑰有助於使破解者的生活變得更加困難,但最終可能被一個能幹的破解者擊敗:解密事物的代碼不能處於加密狀態(包括獲取關鍵),所以它是一個很大的弱點。破解密鑰的那部分以在其他地方保存密鑰會破壞密鑰。

如果軟件在遠程服務器的身份驗證,這可以通過攻擊客戶端和circunventing認證進行加工。如果它從服務器獲取密鑰,則可以使用嗅探網絡來攔截包含該密鑰的服務器數據。如果服務器數據被加密,那麼黑客可以通過分析未加密的軟件並捕獲未加密的數據來解密它。

特別是,如果他使用模擬器運行能夠保存內存快照的軟件(包括算法的未加密版本),那麼對於黑客來說,任何事情都會容易得多。如果他可以在運行軟件的同時直接操縱並鎖定內存,則更容易。

如果你不希望你的不信任客戶端都非常確定,則可以只複雜的事情,並希望他們將永遠不會得到足夠的能量和技能來沃辛打破它。

更好的解決辦法,在我看來,是讓所有的軟件在您值得信賴的服務器,並讓他們的服務器只問你的服務器來完成這項工作,並保持你的算法,在您的服務器。這比其他一切都更安全和簡單,因爲它消除了基本問題:用戶不再擁有對算法的物理訪問權限。您應該真的考慮通過消除將代碼保留在客戶端中的需求來實現此目的的方法。然而,即使這不是牢不可破的,黑客可以通過分析輸入函數的輸出來推斷出算法的作用。在大多數情況下(看起來不是這種情況),算法不是系統中最重要的,而是數據。因此,如果你真的無法避免在不受信任的團隊中運行算法,那麼你不能做比你已經說過的更多的事情:加密所有東西(優先考慮硬件),驗證和檢查一切,破壞重要的數據在有人考慮備份它之前,如果你懷疑有什麼不對,並且讓別人破解它很難。


,但如果你真的想要一些想法,真要做到這一點,我們開始吧:

我可以建議你使你的程序突變。一世。E:當你解密你的代碼時,用一個不同的密鑰加密並丟棄舊密鑰。從服務器獲取一個新的密鑰,並聲明密鑰本身的編碼方式很難用服務器嘲弄新密鑰泄漏的東西。保證密鑰是唯一的,不會被重複使用。同樣,這不是不可破解的(並且破解者會做的第一件事就是攻擊這個特性)。

還有一件事:把很多不明顯的紅色鯡魚,做無意義的奇怪的一致性檢查,其中很多非功能性的虛假版本的算法,並添加了很多複雜的overbloat,有效地什麼也沒做,斷言它按照預期從真實代碼運行。讓真正的代碼做一些看起來很奇怪和無意義的事情。這使得調試和反向工程變得更加困難,因爲破解者需要付出很多努力來分離什麼是垃圾。

編輯:顯然,使垃圾代碼看起來比正確的一部分更好,所以一個黑客會先看看那裏,有效地失去時間和耐心。不用說,混淆一切,所以即使破解者獲得原始的未加密運行代碼,它仍然看起來很混亂,很奇怪。

1

總結答案,是的。對於這個問題沒有「完全安全」的解決方案,因爲它需要homomorphic encryption(現在只存在於需要大量計算的有限原型中)。在實踐中,您需要的是正確的需求工程和安全工程的組合(評估部署系統中的利益相關者,興趣,有價值的資產,每個成功的攻擊場景可能發生的攻擊和損害以及防禦它的成本)。

之後,您將看到保護不是真的需要,或者您可以部署一些合理的措施並用合法的東西覆蓋其他「漏洞」,或者完全重新設計系統,從商業模式開始(不太可能,但也可能)。

一般來說,安全是系統工程問題,您不應該僅限於技術方法。

2

我知道其他人可能會在這個解決方案中發現漏洞 - 並且隨時可以這麼做,因爲我以此爲生,並歡迎挑戰! - 但爲什麼不能做到這一點:

  1. 既然你都清楚地使用Windows,啓用與最大的安全設置硬盤驅動器上的比特更衣室驅動保護。根據我的理解,這將有助於緩解克隆驅動器的人 - 如果我錯了,就這麼說! - 其內容將根據系統硬件設置進行加密。

  2. 在硬件上啓用TPM併爲您的軟件正確配置它。這將有助於停止硬件嗅探。

  3. 禁用您未使用的任何帳戶,並鎖定系統帳戶和組以僅使用您所需的帳戶。用於設置活動目錄和安全VPN的獎勵點,以便您可以通過後門遠程訪問其網絡,以便在不進行正式現場訪問的情況下檢查系統。

  4. 爲了提高進入該技術所需的技術欄,請使用C++或其他非.Net語言編寫軟件,因爲MSIL字節碼可通過公共免費工具輕鬆解編爲源代碼,並且需要更多的技術技能來反編譯裝配中的某些東西,即使它仍然非常適合使用正確的工具。確保你啓用了所有你將要使用的硬件的cpu指令,以進一步使問題複雜化。

  5. 讓您的軟件經常驗證部署系統的硬件配置文件(唯一硬件ID)。如果失敗(如硬件改變),它會自毀。

  6. 一旦硬件已經驗證,將加載的二進制映像加載到加密的RAM磁盤中,然後將其本身在(非固定!)內存中加密。不要固定它,或者使用恆定的內存地址,因爲這是一個壞主意。

  7. 要非常小心,一旦解密完成,密鑰將從RAM中刪除,因爲一些編譯器會愚蠢地優化非安全bzero/memset0調用並將密鑰留在內存中。

  8. 請記住,安全密鑰可以通過其與其他內存塊相關的隨機性在內存中檢測到。爲了幫助緩解這一點,請確保使用多個「虛擬」密鑰,如果使用該密鑰,則會觸發入侵檢測和爆炸場景。既然你不應該固定鍵所使用的內存,這將允許人們多次觸發相同的虛擬鍵。如果您可以隨機生成所有虛擬鍵,並且每次由於下面的#12,真正的鍵都不同,所以它們不能簡單地查找不會更改的鍵,因爲它們都可以。

  9. 利用多態彙編代碼。請記住,程序集實際上只是可以根據指令和堆棧狀態/之前調用的內容進行自我修改的數字。例如,在一個簡單的i386系統中,通過簡單地減去5,0x0F97(如果上面設置了字節)可以很容易地完全相反(設置字節,如果下面的)指令。使用你的密鑰來初始化堆棧,並且如果你真的使用CPU的L1/L2緩存想去努力核心。

  10. 確保您的系統瞭解當前日期/時間並驗證當前日期/時間是否在可接受的範圍內。從部署開始的一天開始,將其限制爲4年將與保修/支持下的硬盤驅動器硬件故障的鐘形曲線兼容,以便您可以利用此類保護並使您在硬件更新之間保持良好的時間。如果驗證失敗,請自行殺死。

  11. 通過確保您的pid文件每隔一段時間更新一次當前時間,您可以幫助減輕人們與時鐘混淆的時間;比較上次修改時間(作爲文件系統上的加密數據及其文件屬性)與當前時間的比較將是一個早期預警系統,用於人們是否與時鐘連接。在檢測到的問題上,爆炸。

  12. 所有的數據文件都應該使用在您的命令中更新自己的密鑰進行加密。將系統設置爲每週至少更新一次,並且每次重新啓動。將其添加到您應該具有的軟件的「從服務器更新」功能中。

  13. 所有密碼學都應遵循FIPS指南。因此,請使用強大的加密技術,使用HMACS等。根據您當前的情況,您應該嘗試達到FIPS-140-2-level-4規範,但可以理解的是,從經濟角度和實際情況來看,某些要求可能並不可行,FIPS-140 -2級2可能是你的限制。

  14. 在所有的自毀案例中,首先讓它回家給你,讓你立刻知道發生了什麼。

最後一些非軟件解決方案:

  1. 如果它不能打電話回家..作爲最後一個努力的一個定製硬件設備連接到內部串行/ USB端口,該端口被設置爲激活一個繼電器,然後如果它檢測到案件,硬件或軟件篡改,則會啓動一塊Thermite。將它放在硬盤的頂部並將它們放置在主板上將最有效。但是,如果這不是美國軍方批准的情況,那麼您需要向法務部門查詢許可證等,因爲我假設您在美國。

  2. 要確保硬件沒有被篡改,請參閱FIPS物理安全要求,以獲取有關確保系統物理安全的更多詳細信息。獎勵積分,如果您可以看到有關使用舊式AS400機箱的現代機架作爲僞裝進行螺栓連接/焊接,以幫助減輕硬件的移動/篡改。年輕人不知道該怎麼做,並擔心打破「舊東西」,年長的人會想知道「wtf?」,而且大多數人都會留下血跡,以後可以用作篡改證據,如果他們經常篡改尖銳的情況下,至少根據我自己的經驗。

  3. 在入侵通知的情況下,從軌道核武器..它唯一的方法是確定的。 ;)只要確保您具有填寫的所有法律形式和訪問要求,法律就能夠減輕風險或責任;或者您可以設置您的通知系統,以便在您獲得電子郵件時自動發送電子郵件/文字/電話告訴你它爆炸了。