Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863588826

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

數據可以說是互聯網時代的黃金和鑽石。黑客一直在虎視眈眈的盯著這塊肥肉,他們不斷地計劃、準備和執行複雜的有針對性的攻擊,剝奪企業有價值的數據。

擴展檢測和響應(XDR) 提供了一種保護業務數據免受高級威脅的方法。 XDR 安全解決方案旨在簡化事件響應,為安全團隊配備創新的威脅檢測技術,以改進和加速響應工作流程。然而,大多數現成的XDR 平台僅涵蓋常見任務,迫使具有獨特安全需求的組織尋找可定制的選項。

在本文中,我們將仔細研究XDR 平台的本質,討論XDR 的優勢,比較不同類型的平台,並分析常見架構和功能集。我們還概述瞭如果您決定構建或定制這樣的平台需要注意的事項。本文將有助於技術領導者評估各種實施選項並考慮創建自定義XDR 解決方案。

如何利用XDR 增強業務數據安全業務數據駐留在多個端點並通過無盡的渠道流動,形成了一個如此龐大和復雜的安全環境,傳統工具無法再對其進行保護。

由於沒有集中的地方來監控、分析和管理數據的安全性,企業在面對高級威脅和復雜的網絡安全攻擊時常常感到茫然不知所措。最近迫切需要轉向遠程工作,這凸顯了擁有這樣一個集中的數據可見性和管理點的重要性和價值。

針對這一需求,安全專業人士提出了一個新概念:擴展檢測和響應。

什麼是XDR 平台?

雖然XDR 平台還沒有統一的定義,但該概念的創建者Nir Zuk和Microsoft提出的流行定義可以總結如下:

XDR 平台是一種解決方案,它提供了一個統一點,用於從各種來源收集安全數據,從而實現上下文數據分析、高級威脅檢測和有效響應。

XDR 安全平台的概念可以被視為其前身演變的下一步:

端點檢測和響應(EDR)

安全信息和事件管理(SIEM)

安全編排、自動化和響應(SOAR)

image.png

XDR 系統應該與其前身有效集成,不僅包括先進的EDR、SIEM和SOAR 系統,還包括防火牆和防病毒軟件等更常見的工具。利用所有這些工具和系統作為數據和功能源,XDR 使安全團隊最終能夠克服他們過去處理的限制和網絡安全問題,我們將在下一節中介紹這些問題。

您的企業如何從使用XDR 平台中受益?儘管XDR 解決方案的功能集可能有所不同,但它們的目標保持不變- 幫助安全專家解決傳統網絡安全工具的常見局限性:

image.png

來自不同安全工具和服務的孤立數據。此類數據降低了威脅檢測和事件響應的效率,因為安全專家必須手動關聯不同來源的數據才能了解事件的全貌。 XDR 平台可以通過將來自不同系統、服務和工具的數據聚合到一個地方來幫助簡化數據管理。

缺乏跨多個安全層的可見性。大量安全數據來自不同的IT 環境:端點、網絡和雲。使用傳統的網絡安全工具,很難從所有數據中構建出一個大的、統一的圖片。例如,通過EDR,您可能會看到攻擊者使用的入口點,但有關攻擊的進一步分佈以及受其影響的用戶和系統的信息有限。 XDR 解決方案擴展了整個IT 基礎設施的可見性,使安全專家能夠關聯來自不同來源的威脅指標並獲取每個事件的完整背景。

大量誤報導致警報疲勞。這給安全團隊帶來了不必要的開銷,並增加了低效處理造成真正危險的事件和威脅的風險。 XDR 平台可以通過統一從不同來源收集的數據、應用高級警報規則以及提高整體工作流程自動化來減少發送給安全團隊的警報數量。

來自多種攻擊媒介的高級威脅以及使用機器學習(ML) 和人工智能(AI) 等先進技術執行的攻擊。傳統安全解決方案很難檢測到此類威脅。通過應用先進的分析技術、機器學習和人工智能機制來關聯和處理收集的數據,XDR 工具可以更輕鬆地檢測和響應此類威脅。

主要基於手動操作的不良事件響應很容易出現人為錯誤,並通過增加平均響應時間來升級威脅。借助XDR,您可以訪問改進的威脅分析和響應操作的精細自動化,從而提高安全團隊的效率。

借助XDR 平台檢測威脅並緩解威脅的通常工作流程包括三個主要階段:

image.png

1. 攝取— 從不同來源收集數據:端點、雲環境、網絡流量等。

2. 檢測— 使用先進的機器學習算法和人工智能模型關聯和分析收集的數據。

3. 響應— 根據檢測到的威脅的優先級安排自動響應,並收集手動調查所需的上下文數據。

雖然XDR 安全概念相對較新,但企業已經面臨多個XDR 平台可供選擇。在以下部分中,我們將討論在尋找適合您業務需求的XDR 平台時應注意的事項,以及如何確定構建自定義平台是否對您有利。

選擇正確的XDR 解決方案時應遵循的標准在決定將哪種現成XDR 產品用於組織的網絡安全時,請注意以下三個主要標準:

所需功能— 在完成相同的高級任務的同時,現成的XDR 安全工具提供不同的功能集。有些可能擁有更強大的人工智能模塊,而另一些則提供複雜的數據保護機制。做出最終選擇時請考慮您的個人要求。

配置靈活性— 您希望XDR 系統的靈活性越高,找到合適的系統就越困難。然而,在配置數據聚合、事件響應場景或報告時,靈活性至關重要。提前確定您想要高度可定制的功能。

易於管理——作為一個複雜的解決方案,XDR 平台可能很難編排和管理。根據平台的類型(稍後詳細介紹),您可能需要付出額外的努力來配置和維護它。

了解這些標準將幫助您確定XDR 系統的核心要求,從而找到適合您的系統。

評估現成的XDR 解決方案時需要考慮的另一個重要細節是平台類型。目前,您可能會遇到兩種常見的XDR解決方案:

1. 原生XDR 平台集成了來自單一供應商的安全工具和解決方案。此類平台的主要優點之一是最大限度地減少兼容性和集成問題。與此同時,這些平台最容易受到供應商鎖定,因此靈活性最差。使用第三方工具擴展平台功能的選項並不多。

本機XDR 的常見示例包括Microsoft 365 Defender、Cisco XDR 和Palo Alto Networks Cortex XDR。

2. 開放XDR平台不限於單一供應商的產品和服務。雖然仍然提供集中式平台管理功能,但它們依賴於不同供應商的第三方工具和服務。與原生平台相比,此類平台往往更加靈活,但仍然存在供應商鎖定的風險,因為您很少能夠選擇核心功能的提供商。

據Gartner 稱,開放XDR 包括Splunk、LogRhythm 和QRadar。

一些XDR 供應商以託管服務的形式提供解決方案。與雲服務提供商類似,託管檢測和響應(MDR)供應商自行幫助企業配置和編排其網絡安全資源。然而,就像常規雲服務一樣,默認的MDR 服務是基於訂閱的,這對於某些企業來說可能不是最佳的財務解決方案。它們還提供有限的可擴展性和靈活性,並且並不總能滿足醫療保健或金融等受到嚴格監管的行業的獨特要求。

據Gartner 稱,提供MDR 服務的供應商包括Sophos、ReliaQuest 和Arctic Wolf。

如果現有解決方案沒有完全滿足您的要求,您可以考慮可能的自定義選項- 下一節將詳細介紹。

在這篇文章中,我將介紹我在逆轉Office的身份驗證機制時發現的兩個問題,並提供一些不需要刪除內存的POC工具來幫助恢復存儲的令牌。

微軟賬戶服務我必須承認,當我第一次開始研究這個問題時,刪除我正在運行的Word進程的內存並沒有發現文檔簽名eyJ0eX。這是當前工具用來識別活動令牌的主要方法,我在Windows登錄時使用Microsoft 365帳戶。

事實證明,Microsoft Account (MSA)的身份驗證令牌處理方式與通常的Azure AD SSO帳戶不同。

讓我們從查看經過MSA驗證的Office會話開始,啟動Microsoft Office並查看加載的DLL。其中最突出的是MicrosoftAccountWAMExtension.dll。將這個DLL加載到Ghidra中,我們可以開始尋找為MSA帳戶生成身份驗證令牌的原因。

如果我們在這個DLL中尋找RPC調用,就可以看到一堆被定向到名為wlidsvc的服務:

1.png

不幸的是,微軟並沒有為RPC調用此服務提供IDL(或者根本沒有提供很多信息),所以我們將不得不做一些逆向工程來解決這個問題。

讓我們將WinDBG附加到wlidsc並監視正在進行的RPC調用。在任何Office進程中進行身份驗證之後,我們看到第一個調用是RPC方法WLIDCCreateContext以創建上下文,然後是WLIDCAcquireTokensWithNGC,最後是一系列其他調用,我們將暫時忽略這些調用。

如果我們在後一種方法中添加一個斷點,那登錄到Office中的MSA帳戶會導致命中:

2.png

步進式(Stepping )直到我們點擊ret並檢查填充的參數,在參數12的內存區域中會顯示一些有趣的東西。

3.png

對我來說,這確實是一個像徵!如果我們打開像Fiddler這樣的代理,我們會看到它與Office訪問web服務時使用的身份驗證令牌格式相匹配:

4.png

那麼,我們如何從我們自己的工具中調用它呢?讓我們使用James Forshaw的NtObjectManager生成一個可以使用的存根。

5.png

生成的RPC存根根據Windows版本的不同而不同,這是毫無價值的,例如,在Windows 10中,我們發現字段計數在輸入結構上發生了變化,因此,如果你收到可怕的(0x800706F7) - The stub received bad data.錯誤,請多家留意。

使用RPC客戶端存根創建一個快速的C#應用程序,我們將重播我們之前觀察到的入站RPC調用,並添加參數,這將給我們提供如下內容:

6.png

如果我們稱之為:

7.png

由於這是MSA身份驗證請求,我們將不得不使用Substrate等服務來訪問Microsoft 365服務。旋轉一個代理並在Office中導航是確定調用什麼以及這些web服務採用什麼參數的最佳方式。但你可以看到,passport令牌返回後,我們可以很好地進行身份驗證和交互:

8.png

令牌緩存現在我們已經了解瞭如何恢復MSA,那麼Azure AD呢?通過Lee Christensen的帖子知道,我們可以很容易地按需請求新令牌,但是我們在Office進程中看到的緩存令牌被轉儲了,它們是如何在啟動時加載的呢?

讓我們提供一個新的主機並將我們的用戶帳戶與AzureAD相關聯,然後登錄到Office,再嘗試找出令牌存儲的位置。

9.png

為了確保我們在正確的軌道上,讓我們從內存中轉儲一些字符串,並確保eyJ0eX簽名存在。

10.png

我們再次深入搜索dll,但這次我們將重點關注Windows.Security.Authentication.Web.Core.dll。

這是一個WinRT庫,因此我們需要深入Ghidra了解正在發生的事情。

AddWebTokenResponseToCache方法如下:

11.png

如果我們進一步研究,會發現此方法實際上負責將憑據緩存到序列化文件,這些文件可以在%LOCALAPPDATA%\Microsoft\TokenBroker\Cache中找到。

12.png

好的,讓我們看看這些TBRES文件:

13.png

如果我們使用ProcMon,我們會看到這些文件確實在進程啟動時被Office訪問:

14.png

可以看到,這就是我們的身份驗證信息存儲的地方!查看JSON會發現一個IsProtected字段。在WinDBG中,我們將附加到Office,在CryptUnprotectData上添加斷點並重新啟動。果然,我們發現base64解密數據的內容被解密了。

15.png

JSON文件中我們特別感興趣的字段是ResponseBytes,我添加了一個帶有快速工具的repo,該工具可以解密這些文件,可以在這裡找到。

在使用ProtectedData.Unprotect解密此數據後,我們看到了明文JWT。果然,解密它們會得到我們之前從內存中看到的相同信息:

16.png

來自不同提供者和應用程序的其他令牌也存儲在這些文件中,包括MSA令牌,這也是毫無價值的。

現在我們知道了,Windows和Office用於Live和Azure的認證和緩存會話的幾種不同方法。

POC可以在https://github.com/xpn/WAMBam上找到。

現代IT 產品通常必須處理各種文件格式。雖然確保與開放文件格式的兼容性很容易,但讓您的軟件處理專有或封閉文件格式卻很棘手。

主要的挑戰是沒有一種通用的解決方案來反轉專有文件格式。在每種情況下,您都必鬚根據手頭的數據採取不同的行動。

在本文中,我們探討了專有文件格式是什麼以及為什麼您可能需要對一種文件格式進行逆向工程。我們還分享了我們處理封閉格式文件的經驗,並展示了一些從中恢復數據的方法。本文對於希望通過支持封閉文件格式來增強產品互操作性的開發領導者很有用。

以專有格式反轉文件的方式和原因文件格式具有用於結構化和存儲數據的特定編碼方案。如果沒有特定的軟件或硬件,專有文件格式通常無法解碼和解釋。數據通常由專有軟件以專有格式讀取和保存。

專有格式通常被設計為保密的,這意味著數據編碼格式的規範不公開發布或僅在保密協議下披露。有時,創建者(個人開發者或組織)會發布編碼詳細信息,但會通過許可證限制格式的使用。因此,專有格式被認為是封閉格式,與公開格式形成對比,開放格式可供所有人免費使用。

封閉文件格式的著名示例是WMA 和CDR。一些流行的文件格式,如XLS 和DOC,過去是封閉的和未記錄的,但現在是開放的。

為什麼需要對專有文件格式進行逆向工程?

軟件開發人員通常需要對專有文件格式進行逆向工程以提高軟件互操作性。

處理封閉文件格式的法律立場因各國與軟件專利相關的法律而異。但是,為提高互操作性而對文件格式進行逆向工程通常是合法的。此外,您可能需要對計算機取證的封閉文件格式進行逆向工程。

沒有通用的方法來對每次都有效的封閉文件格式進行逆向工程。每個案例都是獨立的。在本文中,我們探討了針對不同情況恢復專有文件格式的三個示例:

image.png

確定專有文件格式的3 種方法

讓我們詳細探討每個場景,從我們可以避免逆向工程的場景開始。

如何根據文件簽名確定專有文件格式使用任何文件格式都從發現格式的名稱並找到可以使用它的解析器開始。有時,此過程可能很簡單,您只需在Google 中鍵入file extension parser 即可找到相關的解析器。

但是,文件擴展名有時與文件的實際格式不匹配。例如,計算機遊戲通常將其資源文件擴展名指定為DAT,儘管它們內部可以是ZIP 文件。此外,一些基於Matroska容器的視頻格式使用自定義編解碼器來傳輸視頻,因此它們具有非標准文件擴展名。

要確定文件格式,您可以使用專門的工具,例如:

file(1) — 在Linux 中確定文件類型的工具

Binwalk — 用於分析、逆向工程和提取固件映像的工具

FACT 提取器——提取最常見容器格式的工具

然後,您需要檢查文件是否已存檔和加密。一種方法是使用Hex Workshop 中的Data Visualizer功能。

如果文件可能被歸檔,請嘗試使用7-Zip打開它。令人驚訝的是,這個文件歸檔器可以通過掃描文件的開頭來識別格式。即使文件在ZIP 數據之前有一些自定義標頭,7-Zip 仍然可以識別它。

另一個有用的工具是Offzip,它允許您以二進制代碼搜索zlib 流並將它們提取為文件。

所有這些工具都提供了識別已知文件格式並避免在沒有實際需要的情況下進行逆向工程的機會。但是如果您找不到文件格式,您可以嘗試使用文件的簽名來搜索它。要發現文件的簽名,請在十六進制編輯器中打開文件。

文件簽名,也稱為幻數,是文件開頭的唯一字節序列,用於標識其格式。通常,文件簽名是指文件的前二到八個字節。獲得文件簽名後,在Google 和GitHub 上搜索幻數,使用在網站或代碼中如何描述這些數字的不同變體。

假設您的文件簽名以以下字節開頭:41 50 52 34 65 76 65 72。以下是您應該嘗試的搜索請求的幾個示例:

41 50 52 34 65 76 65 72 簽名

41 50 52 34 65 76 65 72 魔法

41 50 52 34 簽名

41 50 52 34 魔法

41505234(因為簽名也可以是DWORD)

0x410x500x520x340x650x760x650x72 簽名

0x41505234

0x34525041(如果是小端)

您還可以使用美國信息交換標準代碼(ASCII)。在我們的例子中,我們對文件簽名的搜索查詢看起來像“APR4ever”。

這種方法可以幫助您識別這種文件格式類似於什麼,甚至可以找到一個現成的解析器。您還可以找到這種格式的其他文件,並分析它們的創建者和解析方式。

如何使用可執行文件對數據格式進行逆向工程如果您在Google 上徹底搜索文件簽名後仍未找到任何內容,則可能意味著您的文件格式確實很少見。在這種情況下,您可以使用可以解析此特定格式的可執行文件開始對您的專有文件格式進行逆向工程。但是如何找到這個可執行文件呢?

有兩種選擇:方案一:通過目標文件的簽名查找可執行文件。掃描與您計劃進行逆向工程的文件一起使用的整個程序目錄,搜索二進制形式的簽名。按文件內容啟動搜索以查找與目標文件匹配的簽名。查找目標文件以使用專用工具(如Effective File Search或Total Commander for Windows)或命令行工具(如分別在Linux 和macOS 上的grep或Binwalk)開頭的字節。

如果找到匹配的簽名,則將可執行文件加載到交互式反彙編程序(IDA) 中,搜索檢查文件簽名的位置,然後開始逆向執行進一步解析數據的代碼。

如果一個文件沒有簽名或者你在按文件內容搜索時沒有找到任何東西,你可以在運行時分析這個文件。

選項2:在運行時分析目標文件。啟動Process Monitor,為文件操作設置過濾器,並嘗試捕捉專有文件打開的時刻。然後,查看進程監視器中的相關行以查找文件的CreateFile 操作或第一個ReadFile。查看此事件的堆棧,了解哪個可執行文件試圖調用ReadFile(),更重要的是,代碼中的地址是什麼。將您的文件上傳到IDA 並查看解析如何運行,就像簽名搜索一樣。

通常,用於解析的代碼位於靠近閱讀開始的地方。在這種情況下,查看所有ReadFile 操作,查看讀取了多少字節,並查看這些字節在文件中的位置。

但是,有些文件可以用更複雜的方式開發。例如,開發人員可以使用流類甚至自定義類來訪問基於具有虛擬函數和多線程的類層次結構的文件,而不是使用簡單的函數來讀取文件。

在這種情況下,當您找到ReadFile函數時,您將找不到任何接近它的解析代碼。您將看到的只是一個從某個虛函數調用的ReadFile,讀取的數據將存儲在緩衝區中。

在這種情況下,您必須:

恢復閱讀器的類

找到使用讀取器從緩衝區接收數據的類

了解該類如何與讀者同步

只有這樣你才能找到解析文件中數據的類。

但是,有時您可能需要從既沒有簽名也沒有可執行文件的文件中恢復數據。讓我們探討一下在這種情況下可以做什麼。

如何在沒有可執行文件的情況下對數據格式進行逆向工程在我們開始探索如何從沒有可執行文件的專有文件格式恢復數據的示例之前,讓我們簡要概述一下信息如何存儲在文件中的一般邏輯。

了解所有文件都具有結構化數據這一點很重要。沒有人以允許隨機放置對象的方式創建文件格式。

每種文件格式都有一定的邏輯。而這個邏輯通常與文件的用途有關。例如,文件系統映像的文件必須具有特定的結構才能存儲元數據,例如大小、名稱和其他屬性。圖像文件必須能夠存儲有關圖像大小、顏色數量和其他圖像元數據的信息。

開發人員在他們創建的文件中組織信息存儲的選項通常有限。邏輯的選擇通常基於開發人員的知識和經驗。沒有必要使這樣的任務過於復雜並嘗試提出原創想法,尤其是在創建專有文件格式時。

現在讓我們探討如何使用真實示例對專有數據文件格式進行逆向工程。這裡我們有一個封閉格式的隨機固件文件。我們無法根據其簽名在Internet 上找到任何信息,並且它沒有可以幫助我們識別格式的獨特擴展名。

image.png

截圖1. 文件夾中的一個固件文件

顯然數據在最大的文件中:swfl_00005684.bin.001_032_079。但我們也可以看到swfl_00005684.xml.001_032_079 文件,這對於揭示如何從目標文件中解析數據很有用。

第一條規則是不要忽視元數據。

在這種情況下,我們會在要恢復的文件附近看到一個XML 文件。打開swfl_00005684.xml.001_032_079 文件後,我們會發現BIN 文件部分的描述:

image.png

在此示例中,SOURCE-START-ADDRESS指向BIN 文件中偏移的片段的開頭。並且SOURCE-END-ADDRESS是這個片段的結尾。

從swfl_00005684.bin.001_032_079 文件中提取數據片段後,如XML 文件中所述,我們得到三個文件。其中一個是數字簽名,另外兩個是另一種具有HAR#$%@ 簽名的專有格式。

我們發現這兩個文件是存檔。第一條線索是Data Visualizer 向我們展示了這些文件在開頭有一些文本,然後是高熵數據。

image.png

屏幕截圖2. 高熵數據在數據可視化工具中的外觀

第二條線索是這個文件在十六進制編輯器中的樣子:

image.png

屏幕截圖3. HAR 文件的開頭在十六進制編輯器中的樣子

它看起來像一個包含存檔文件名稱的表格。然而,挑戰在於找到一種方法來解析這些數據,以便我們可以將zlib 流與其元數據連接起來。

由於我們知道它是有關存檔文件的信息,因此我們將此數據粘貼到記事本中以查看哪些數據正在更改,哪些沒有。這是我們最終得到的:

image.png

屏幕截圖4. HAR 文件頭中的數據在記事本中的外觀

因此,存檔中保存的文件元數據很可能包含創建/更新日期、屬性以及壓縮和解壓縮文件的大小等信息。

關於存檔中不同文件的創建/更新日期的信息會略有不同,因為文件元數據通常以Unix 時間格式顯示。這就是為什麼我們可以看到這個數據大部分是重複的。

我們可以學習使用此文件的第二條規則是了解常見數據類型在十六進制編輯器中的外觀。對於常見的數據類型,我們指的是Unix Time、Dos Time、Float、Double 等。

很明顯,如果元數據包含目錄描述(而不是文件),則不會提及大小。

在目錄之後,我們有一個條目,如下面的屏幕截圖所示。由於它是一個文件描述符,因此該條目的大小字段中填充了值。

image.png

屏幕截圖5. 我們在目錄後得到的條目

出於好奇,我們使用Offzip 掃描工具來驗證我們的猜測,結果如下:

image.png

截圖6. Offzip 工具掃描HAR 文件後的結果

讓我們看看HAR 文件末尾偏移量0x335 處的數據:

image.png

屏幕截圖7. HAR 文件末尾偏移量0x335 處的數據

它是偏移量為0x335 的zlib 流,長度為0x99 字節。

這些是我們已經在元數據中看到的相同數字。所以我們可以得出結論,這個HAR文件只包含/tmp/manifest/usr/share/swe/00005684/00f15000.manifest文件,其餘都是目錄。

因此,我們僅使用文件本身的數據提取了一個未知格式的文件,因為我們了解我們希望在那裡找到的內容。

結論了解如何對專有文件格式進行逆向工程可以幫助您確保您的軟件適用於各種文件格式。

但逆向工程一個封閉的文件格式是具有挑戰性的。它不僅需要逆向工程方面的專業技能,還需要對許多其他主題的深入了解。例如,必須注意存儲在您需要進行逆向工程的文件附近的其他文件,並了解十六進制編輯器中不同數據類型的外觀。

客戶端Cameyo是一家總部位於美國的VAD 服務提供商,在全球開展業務。該公司的VAD 平台為客戶提供了從任何地方在任何設備上安全訪問關鍵業務應用程序的權限,而無需VPN。

挑戰我們的客戶想知道如何保護虛擬應用程序交付平台,並確保在引入新功能的同時高效及時地支持他們的產品。他們希望通過這種方式滿足現有客戶的需求並吸引新客戶。他們正在尋找一支由經驗豐富的開發人員組成的團隊,他們可以適應快速變化的優先級和項目目標,同時保持所交付功能的整體質量。

方法在分析項目並與客戶討論可能的改進後,Apriorit 團隊集中精力實現關鍵的五個目標:

image.png

如何提升產品價值

我們將這些技術任務分為兩類:

通過修復我們的質量保證(QA) 專家發現的錯誤以及解決平台最終用戶報告的錯誤和錯誤來支持現有功能

研究和實施新功能,以增加產品對現有用戶和潛在新用戶的價值

為了滿足客戶的需求並提高產品的可行性,我們組建了一個團隊,其中包括一名項目經理(PM)、一名QA 專家和對C/C++、Go 和遠程桌面協議(RDP) 有深入了解的Windows 軟件專家).

image.png

VDA平台增強技術

結果Apriorit 團隊實施了多項功能,提高了Cameyo 的虛擬應用程序交付平台的安全性、性能和可用性。我們還引入了新的項目管理工具和方法來減少項目的管理開銷。此外,我們的專家對項目文檔進行了實時更新,確保更好地跟踪所有產品變更,並更容易實施進一步的產品改進。

如何做到的在我們多年的合作中,Apriorit 團隊執行了各種旨在幫助我們的客戶實現其目標的任務,從研究競爭對手和市場趨勢到構建新功能和測試VAD 平台的安全性。

以下是我們的團隊為Cameyo 平台實現的四個主要功能:

image.png

VDA 平台的新功能

讓我們詳細了解這些功能中的每一個。

1.掃描儀重定向Apriorit 開發人員實現了掃描儀重定向功能,並將其添加到用.NET 編寫的本機Cameyo 客戶端中。此功能將真實的掃描儀轉發到用戶的RDP 會話,使在遠程服務器上運行應用程序的用戶能夠像使用本地設備一樣使用選定的掃描儀。

我們面臨的主要挑戰之一是解決Cameyo 客戶端的權利限制問題,因為它沒有安裝在最終用戶的系統中。為了克服這些限制,在Cameyo 本機客戶端中,我們構建了一個自定義掃描儀客戶端,負責使用掃描儀。該客戶端的工作流程如下所示:

1. 在端點方面,我們的自定義掃描儀客戶端連接到遠程端點,使最終用戶能夠使用遠程掃描儀。該客戶端可以執行諸如向用戶轉發可用掃描儀列表、確認活動掃描儀的選擇以及傳輸支持的操作模式等操作。

2. 在服務器端,我們實現了一個自定義的TWAIN兼容提供程序,它也充當我們自定義掃描儀客戶端的服務器。使用此提供程序,我們將掃描儀控制命令從RDP 用戶會話傳遞到掃描儀客戶端,並將掃描數據發送回用戶。

我們基於用C 編寫的開源解決方案構建了自定義TWAIN 提供程序,為原始解決方案添加了對會話隔離的支持。由於本機Cameyo 客戶端已經為客戶端-服務器通信提供了一個活動的RDP 會話,因此在TWAIN 提供程序中,我們使用了虛擬Windows 終端服務器(WTS) 通道。

我們還改進了自定義掃描儀客戶端中的數據緩存,以提高轉換掃描圖像的速度,並實施了一個額外的適配器進程,使客戶端與x86 應用程序兼容。

最後,由於本地客戶端和我們的掃描器客戶端是用不同的語言編寫的,我們需要實現一個跨語言的RPC。為此,我們使用了Apache Thrift並創建了一個使用虛擬RDP 通道的附加傳輸層協議。

2.雲隧道為了實現與Cameyo 服務器的安全遠程連接,Apriorit 團隊實施了雲隧道功能。此功能用作將平台的最終用戶連接到Cameyo 服務器的雲節點,並提供一種安全的替代方法來設置用戶與服務器之間的直接連接。

開發此功能時,我們使用了兩種編程語言——Go 用於隧道服務,C 用於鱷梨醬修改。

由於Cameyo 的瀏覽器模塊使用Guacamole 來啟動瀏覽器會話,我們實現了將Guacamole 服務器轉變為客戶端的邏輯。這使我們即使在啟用防火牆的情況下也能建立安全連接。傳統配置在這種情況下不起作用。

我們還實現了一個自定義隧道服務,充當兩個連接客戶端之間的中介。在此服務中,我們實現了兩個服務器:

在我們的RPD 應用程序和瀏覽器之間建立連接

執行握手以交換設置

由於此功能,用戶可以在本地服務器上安全地操作會話,而無需使用入站防火牆端口或VPN 解決方案。

3.GFX模式Cameyo 平台的Web 客戶端依賴於Guacamole 模塊。雖然此模塊可確保不同Web 瀏覽器和操作系統的平台可用性,但Cameyo Web 客戶端中使用的Guacamole 版本相當慢。當最終用戶使用動態圖形內容時,這會損害平台的性能。

為應對這一挑戰,Apriorit 團隊實施了GFX 模式,提高了Cameyo 網絡客戶端在圖形應用程序方面的性能。

在研究可能的解決方案和實施GFX 模式時,我們與Cameyo 的內部團隊密切合作。 Cameyo 希望他們的Web 客戶端能夠以至少每秒30 幀(FPS) 且沒有偽像的高質量準確顯示視頻內容,從而使最終用戶能夠舒適地使用現代視頻編輯應用程序。

為實現這一目標,我們希望利用支持高清屏幕傳輸編解碼器(如avc444 或avc420)的可用RDP 功能。然而,Guacamole 協議不允許我們獲得我們想要的結果。

在尋找可能的解決方案時,我們評估了幾個選項並最終確定了一個簡單但看似有效的想法——將編碼圖形數據流從FreeRDP 重定向到瀏覽器並在那裡解碼。

為此,我們需要擴展Guacamole 協議,使其能夠傳輸使用H.264 編解碼器編碼的內容。在瀏覽器端,我們決定使用WebCodecs——一個內置的Chrome API,允許對音頻和視頻數據進行編碼和解碼。

我們開始研究從FreeRDP 獲取數據的可能方法,並尋找CPU/GPU 負載盡可能低的編解碼器。在對不同的編解碼器進行了一系列實驗之後,我們選擇了libx264——一種基於CPU 的H.264 編碼器,它使我們能夠處理高清視頻數據,而無需花費太多CPU 時間。

4.漸進式網絡應用我們實施的另一個功能是適用於ChromeOS 的漸進式網絡應用(PWA) 解決方案。此功能允許ChromeOS 上的最終用戶將Cameyo 網絡應用程序下載到他們的設備,以便更輕鬆、更快速地啟動遠程應用程序。

為介紹此功能,我們編寫了一個JavaScript 腳本來解決兩個任務:

1. 實現通過打開桌面應用程序訪問門戶的機制

2.緩存內容,加快門戶網站訪問速度

因此,最終用戶可以方便地使用Cameyo 網絡應用程序,甚至不需要打開他們的網絡瀏覽器。

挑戰與解決方案在開展該項目時,Apriorit 團隊成功應對了多項挑戰:

明確目標——這個項目進行了大量的實驗和調整,因為客戶對如何改進他們的產品有很多想法。為確保開發過程易於規劃和評估,我們幫助客戶將這些想法轉化為清晰、可衡量的規範。特別是,我們與客戶舉行了回顧會議,在會上我們評估了我們的進展並闡明了正在開發的功能的目標。

項目文檔的持續維護——我們需要在開發新產品功能的同時編寫和更新大量技術文檔。通過遵循Apriorit 的內部標準程序,我們能夠使所有項目文檔保持最新狀態,從而更輕鬆地跟踪對產品所做的所有更改並保持最終結果的高質量。

複雜的支持程序——由於平台的高度可定制性,我們很難重新創建和修復在特定定制環境中檢測到的錯誤。為了提高我們支持服務的效率,我們設計了一份標準問卷,由Cameyo 專家在收到最終用戶的支持請求時填寫。該調查問卷使我們能夠組織調試所需的信息,並提高支持的速度和效率。

項目管理開銷——最初,Aprioit 團隊的所有任務都在Trello 中分配,這使得項目管理過程既耗時又不明確。為了解決這些問題,我們將所有與項目相關的活動都轉移到了Jira。在配置關鍵流程、構建透明路線圖並建立迭代項目工作流程之後,我們能夠使雙方的開發流程更加高效和可預測。

僅在2021 年,人類就創建、複製和使用了大約74 澤字節(萬億千兆字節)的數據。看起來我們擁有所需的所有數據,但實際上每年都越來越難找到相關信息。幸運的是,數據挖掘等技術可以幫助我們恢復數據的秩序,並利用它來提高我們的網絡安全。

使用數據挖掘技術分析您的數據庫和安全日誌可以幫助您改進對惡意軟件、系統和網絡入侵、內部攻擊以及許多其他安全威脅的檢測。有些技術甚至可以準確預測攻擊並檢測零日威脅。

在本文中,我們研究了關鍵數據挖掘技術以及網絡和端點安全中數據挖掘的五個用例。這篇文章對於開發網絡安全軟件並希望提高其威脅檢測能力的團隊很有用。

網絡安全中的數據挖掘:過程、優點和缺點什麼是數據挖掘?數據挖掘是分析信息、發現新模式和數據以及預測未來趨勢的過程。它經常用於科學研究、業務開發、客戶關係和其他領域。

雖然術語數據挖掘通常被視為數據庫中知識發現(KDD)的同義詞,但它實際上只是KDD 過程中的步驟之一。 KDD 的主要目標是從大量數據中獲取有用且通常是以前未知的信息。整個KDD流程包括四個步驟:

image.png

數據庫中知識發現的4 個步驟

KDD 廣泛應用於任何可以從海量數據分析中獲益的領域:科學研究、商業分析、營銷研究等。它還被網絡犯罪分子用來尋找新的攻擊方式,並被網絡安全專業人員用來檢測和阻止這些新的攻擊。

結合數據挖掘和網絡安全可以確定網絡攻擊的特徵並改進攻擊檢測過程。為了獲得有價值的知識,數據挖掘使用了來自統計學、機器學習(ML)、人工智能(AI) 和數據庫系統的方法。

數據挖掘可幫助您快速分析龐大的數據集並自動發現隱藏的模式,這對於創建能夠檢測以前未知威脅的有效反惡意軟件解決方案至關重要。但是,使用數據挖掘方法的最終結果始終取決於您使用的數據質量。

依靠數據挖掘來改進保護有其自身的優點和缺點。讓我們來看看它們:

image.png

這些是出於網絡安全目的而挖掘數據的一般利弊。除此之外,每種數據挖掘技術都有自己的優勢、局限性和特定的用例。讓我們來看看網絡安全的六種關鍵數據挖掘方法。

6 大關鍵數據挖掘技術您可以使用預測或描述技術來挖掘數據庫。說明性技術根據過去的事件進行預測,而描述性技術側重於對現有數據庫的分析和構建。

讓我們來看看網絡安全的六種關鍵數據挖掘技術:

image.png

挖掘網絡安全數據的技術

分類此技術通過將大型數據集分解為預定義的類、概念和變量組來創建數據庫模型。您還可以使用它來分析構建模型後添加到數據庫中的變量,並為它們分配相應的類。為了實現準確的實時分類,您需要非常注意算法的監督訓練以及測試其工作原理。在網絡安全中,分類通常用於檢測垃圾郵件和網絡釣魚電子郵件。

回歸分析這些算法根據數據集中其他變量的已知平均值來預測一個變量的變化值。使用此技術,您可以在數據庫中建立因變量和自變量之間的關係模型。分析變量的變化並將這些變化與因變量進行比較可以幫助您確定變化的原因以及一個變量對另一個變量的影響。回歸分析廣泛用於預測趨勢和事件,包括可能的網絡攻擊。

時間序列分析這些算法通過分析數據庫中任何數據條目更改的時間來發現和預測基於時間的模式。這種技術對於通過挖掘多年數據庫來深入了解各種週期性活動特別有用。您可以依靠時間序列分析來預測在特定事件、季節甚至一天中的某個時間發生的安全漏洞和攻擊。

關聯規則分析這是最廣泛的數據挖掘算法之一。關聯規則分析可以幫助您發現數據庫中頻繁一起出現的變量之間可能存在的關係,並發現隱藏的模式。您可以應用此技術來分析和預測用戶行為、檢查網絡流量以及定義網絡攻擊模式。安全人員經常使用關聯規則分析來研究攻擊者的行為和思維方式。

聚類聚類有助於識別具有共同特徵的數據項並了解變量的異同。它類似於分類,但聚類不能實時對變量進行排序。此技術只能幫助您構建和分析現有數據庫。與分類相比,聚類允許在模型中進行更改並創建子集群,而無需重新設計所有算法。

總結這種數據挖掘技術側重於編譯數據集、類和集群的簡要描述。摘要可以幫助您更好地了解數據集的內容和數據挖掘過程的結果,因為它可以掌握數據的本質並消除手動挖掘數據的需要。在網絡安全解決方案中,匯總主要用於生成報告和可視化日誌。

請記住,這些數據挖掘技術中的每一種都可以通過ML 和AI 算法得到增強。這些尖端技術可以幫助您發現更多隱藏的模式並提高預測的準確性。然而,將ML 和AI 添加到網絡安全解決方案中肯定會增加其開發和維護的複雜性。

接下來,我們將仔細研究特定用例,展示如何將數據挖掘用於網絡安全解決方案。

網絡安全中的數據挖掘用例您可以將數據挖掘應用於任何數據庫,並根據您想要實現的任何目標對其進行調整。在網絡安全領域,挖掘算法通常有助於發現可能表明安全事件的異常數據記錄和事件。

以下是數據挖掘在計算機安全領域最常見的五種應用:

image.png

1.惡意軟件檢測在構建安全軟件時,開發人員使用數據挖掘方法來提高惡意軟件檢測的速度和質量,以及檢測零日攻擊。

檢測惡意軟件的策略有以下三種:

image.png

惡意軟件檢測策略

異常檢測涉及對系統或網絡的正常行為進行建模,以識別與正常活動模式的偏差。基於異常的技術甚至可以檢測到以前未知的攻擊,並可用於定義濫用檢測器的簽名。

但是,異常檢測甚至可以報告偏離規範的合法活動,從而產生誤報。

誤用檢測,也稱為基於簽名的檢測,僅根據簽名示例識別已知攻擊。這種技術的誤報率較低,但無法檢測到零日攻擊。

混合方法結合了異常和濫用檢測技術,以增加檢測到的入侵數量,同時減少誤報數量。混合檢測算法不構建任何模型。相反,他們使用來自惡意軟件和合法程序的信息來創建分類器,這是一組規則或由數據挖掘算法生成的檢測模型。然後系統的異常檢測部分搜索與正常配置文件的偏差,系統的誤用檢測部分查找代碼中的惡意軟件簽名。

無論您選擇哪種策略,惡意軟件檢測系統的開發都包括兩個步驟:

image.png

惡意軟件檢測過程

首先,數據挖掘算法從API 調用、n-gram、二進製字符串、程序行為和其他事件的記錄中提取惡意軟件特徵。您可以應用靜態、動態或混合分析來從可能不安全的文件中提取惡意軟件特徵。

在分類聚類的過程中,可以使用相應的技術,根據特徵分析對文件樣本進行分組。此時,您需要使用RIPPER、決策樹、人工神經網絡、樸素貝葉斯或支持向量機等分類算法構建分類器。

使用ML 技術,每個分類算法都會構建一個模型來表示良性和惡意類。使用此類文件樣本集合訓練分類器使您甚至可以檢測新發布的惡意軟件。

2.入侵檢測攻擊者可以通過組織的網絡、數據庫、服務器、Web 客戶端和操作系統執行惡意入侵。使用數據挖掘技術,您可以分析審計結果並識別異常模式。因此,您可以檢測入侵、網絡和系統掃描、拒絕服務和滲透攻擊。

數據挖掘方法對於檢測這些類型的入侵特別有效:

image.png

通過數據挖掘檢測入侵

要檢測基於主機的攻擊,您的網絡安全軟件需要分析從程序中提取的特徵。檢測基於網絡的攻擊需要這樣的解決方案來分析網絡流量。與惡意軟件檢測一樣,您可以查找異常行為或濫用案例。

入侵檢測系統通常基於分類、聚類和關聯規則技術。這些技術允許從數據庫中提取攻擊特徵,將它們系統化,並標記任何具有相同特徵的新記錄。您可以在此處使用的一些算法包括回歸和決策樹、貝葉斯網絡、k 最近鄰、學習自動機和層次聚類。

您還可以向入侵檢測系統添加預測功能。分類和時間序列分析等技術可以計算未來入侵的可能性。使用AI 算法可以更輕鬆地檢測隱藏的或以前未知的可疑活動。

3.欺詐檢測檢測欺詐具有挑戰性,因為欺詐活動通常很隱蔽,而且網絡犯罪分子不斷發明新的欺詐模式。

利用機器學習的數據挖掘技術可以發現多種類型的欺詐行為,從金融欺詐到電信欺詐和計算機入侵。 ML 對於欺詐檢測特別有用,因為它可以:

擴展以考慮數據庫數量和復雜性的變化

學習檢測和預測新型欺詐

準確計算欺詐活動的概率

您可以使用監督和非監督ML 算法來檢測欺詐。

通過監督學習,所有可用記錄都被歸類為欺詐或非欺詐。然後使用此分類來訓練模型以檢測可能的欺詐行為。這種方法的主要缺點是無法檢測新型攻擊。

無監督學習方法從未標記的記錄中學習欺詐模式。他們為欺詐活動創建自己的分類和特徵描述。無監督學習有助於在不使用統計分析的情況下識別數據中的隱私和安全問題。它還能夠分析和檢測新型欺詐。

4.威脅情報收集有關網絡安全威脅的證據通常分散在組織的網絡中。這些記錄可用於形成訓練數據集、構建挖掘模型並提高預測準確性。但挑戰在於在數TB 的記錄中找到相關數據。

數據挖掘算法有助於發現此類隱藏數據並將其轉換為結構化的威脅情報數據庫。您可以使用聚類、關聯規則和匯總技術來發現這些類型的智能:

image.png

安全威脅情報的類型

數據挖掘通常僅用於威脅情報的第一階段:發現和構建數據。之後,網絡安全專家必須手動審查發現的數據並決定如何對其採取行動。但是,您也可以使用數據挖掘技術構建一個基於機器學習的框架來收集和處理數據。

5. 內部威脅檢測與預測內部威脅是可能對組織造成傷害的合法用戶的活動。檢測內部威脅活動通常是一項棘手的任務,因為這些行為通常看起來與普通用戶活動相似,或者它們可以被故意隱藏在威脅檢測機制之外。

由於大數據算法可以檢測機器和人類用戶的異常行為,因此它們被廣泛用於檢測和預測內部威脅。與入侵檢測系統類似,內部威脅檢測系統基於識別合法和威脅行為的特徵。

有多種基於機器學習的分類和聚類算法,包括有監督和無監督的,有助於檢測內部威脅。此外,您還可以根據數據挖掘原理訓練深度神經網絡,以檢查網絡安全日誌並實時檢測可能的內部活動。

結論可靠、相關且結構良好的數據是幾乎所有網絡安全解決方案的基礎。雖然組織每天都會生成大量數據,但手動收集和處理所有這些數據以應對網絡安全威脅是不可能的。

數據挖掘技術可以幫助您識別任何惡意活動的特徵,甚至可以預測可能的攻擊。它們在收集威脅情報和檢測惡意軟件、入侵、欺詐和內部攻擊方面特別有效。通過數據挖掘增強保護的主要好處是能夠識別已知攻擊和零日攻擊。

在Windows上,第三方產品有多種方式將其代碼注入其他正在運行的進程。這樣做的原因有很多,最常見的是殺毒軟件、硬件驅動程序、屏幕閱讀器和銀行的需要,當然惡意軟件也會趁機而入。

將第三方產品的DLL注入Firefox進程是非常常見的,超過70%的Windows用戶至少有一個這樣的DLL!需要明確的是,這意味著沒有經過Mozilla或操作系統部分數字簽名的任何DLL。

大多數用戶不在Windows上,第三方產品有多種方式將其代碼注入其他正在運行的進程。這樣做的原因有很多,最常見的是殺毒軟件、硬件驅動程序、屏幕閱讀器和銀行的需要,當然惡意軟件也會趁機而入。

將第三方產品的DLL注入Firefox進程是非常常見的,超過70%的Windows用戶至少有一個這樣的DLL!需要明確的是,這意味著沒有經過Mozilla或操作系統部分數字簽名的任何DLL。

大多數用戶不知道DLL何時被注入Firefox,因為大多數時候除了檢查about:third-party page.之外,沒有明顯的跡象表明正在發生這種情況。

不過,將DLL注入Firefox可能會導致性能、安全性或穩定性問題。原因如下:

1.DLL通常會掛鉤到Firefox的內部函數中,這些函數會隨著版本的不同而變化。所以,第三方產品的發行商必須努力使用新版本的Firefox進行測試,以避免穩定性問題。

2.Firefox作為一種網絡瀏覽器,可以從不受信任和潛在的惡意網站加載並運行代碼。所以,安全研究人員需要付出很多努力來保護Firefox的安全,第三方產品可能對安全性沒有這麼關注。

3.研究人員在Firefox上運行了大量的測試,第三方產品可能不會測試到這種程度,因為它們可能不是專門為配合Firefox而設計的。

事實上,我們的數據顯示,在所有Windows上的Firefox崩潰報告中,只有2%以上是第三方代碼造成的。儘管Firefox已經阻止了許多已知會導致崩潰的特定第三方DLL,但情況依然如此。

這也低估了由第三方DLL間接引起的崩潰,因為研究人員的指標只在調用堆棧中直接查找第三方DLL。此外,第三方DLL在啟動時更容易導致崩潰,這對用戶來說要嚴重得多。

Firefox有第三方注入策略,只要有可能,我們建議第三方使用擴展來集成到Firefox中,因為這是官方支持的,而且更穩定。

為什麼不在默認情況下阻止所有DLL注入?為了獲得最大的穩定性和性能,Firefox可以嘗試阻止所有第三方DLL注入其進程。然而,這會破壞一些有用的產品,比如用戶希望能夠與Firefox一起使用的屏幕閱讀器。這在技術上也很有挑戰性,不可能阻止每個第三方DLL,尤其是使用比Firefox更高權限運行的第三方產品。

自2010年以來,Mozilla已經能夠為Firefox的所有Windows用戶屏蔽特定的第三方DLL。這樣做只是作為最後的手段,在嘗試與供應商溝通以解決潛在問題後,研究人員會盡可能嚴格地進行調整,以使Firefox用戶不再崩潰。目前研究人員只能阻止特定版本的DLL,並且只能在特定的Firefox進程中阻止它。這是一個有用的工具,但只有當特定的第三方DLL導致大量崩潰時,研究人員才會考慮使用它,這樣它就會出現在Firefox崩潰列表中。

即使我們知道第三方DLL會導致Firefox崩潰,但有時DLL提供的功能對用戶來說是必不可少的,用戶不希望安全人員代表他們阻止DLL。如果用戶的銀行或當地政府需要一些軟件來訪問他們的賬戶或報稅,我們屏蔽它不會給他們帶來任何好處,即使屏蔽它會使Firefox更加穩定。

賦予用戶阻止注入DLL的權限在Firefox 110中,用戶可以阻止第三方dll加載到Firefox中。這可以在about:third-party上完成,該頁面已經列出了所有加載的第三方模塊。 about:third-party還顯示了哪些第三方DLL與之前的Firefox崩潰有關,還有就是DLL發布者的信息也會顯示,希望這能讓用戶在知情的情況下決定是否阻止DLL。下面是一個最近導致Firefox崩潰的DLL示例,點擊帶有破折號的按鈕將阻止它:

1.png

以下是阻止DLL並重新啟動Firefox後的情況:

2.png

如果阻止DLL導致問題,在故障排除模式下啟動Firefox將禁用該運行的Firefox的所有第三方DLL阻止,並且可以像往常一樣在about:third-party上阻止或取消阻止DLL。

工作原理阻止DLL加載到進程中是一項棘手的業務,為了檢測加載到Firefox進程中的所有DLL,必須在啟動過程中儘早設置阻止列表。為此,使用啟動進程,它創建處於掛起狀態的主瀏覽器進程。然後,它設置任何沙盒策略,從磁盤加載阻止列表文件,並在啟動該進程之前將條目複製到瀏覽器進程中。

複製是以一種有趣的方式完成的,啟動程序進程使用CreateFileMapping()創建一個操作系統支持的文件映射對象,在用塊列表條目填充後,複製句柄並使用WriteProcessMemory()將句柄值寫入瀏覽器進程。具有諷刺意味的是,WriteProcessMemory()經常被用作第三方DLL將自己注入其他進程的一種方式,這裡我們使用它在已知位置設置一個變量,因為啟動器進程和瀏覽器進程是從同一個.exe文件運行的!

因為所有的事情都發生在啟動的早期,在加載Firefox配置文件之前,被阻止的dll列表是按Windows用戶而不是按Firefox配置文件存儲的。具體來說,文件位於%AppData%\Mozilla\Firefox中,文件名格式為blocklist-{install hash},其中install hash是Firefox磁盤上位置的哈希值。這是一種簡單的方法,可以將不同Firefox安裝的阻止列表分開。

檢測並阻止加載DLL為了檢測DLL何時試圖加載,Firefox使用了一種稱為函數攔截或掛鉤的技術。這會修改內存中的現有函數,以便在現有函數開始執行之前可以調用另一個函數。之所以如此,原因有很多,它允許更改函數的行為,即使函數不是為了允許更改而設計的。 Microsoft Detours是一種常用於攔截函數的工具。

在Firefox中,研究人員感興趣的函數是NtMapViewOfSection(),每當加載DLL時都會調用它。我們的目標是在發生這種情況時得到通知,這樣我們就可以檢查阻止列表,並禁止加載DLL(如果它在阻止列表上)。

為此,Firefox使用一個自定義的函數攔截器來攔截對NtMapViewOfSection()的調用,並返回如果DLL在阻止列表上則映射失敗的消息。為此,攔截器嘗試了兩種不同的技術:

在32位x86平台上,從DLL導出的一些函數將以一條不執行任何操作的兩字節指令(mov edi, edi)開始,並且在此(nop或int 3)之前有五條未使用的一字節指令,例如:

3.png

如果攔截器檢測到這種情況,它可以將未使用指令的五個字節替換為要調用的函數地址的jmp。由於研究人員是在32位平台上,因此只需要一個字節來指示跳轉,四個字節來表示地址,因此:

4.png

當修復的函數想要調用未修復版本的DLLFunction()時,它只需跳過DLLFunction()地址2個字節即可啟動實際的函數代碼

否則,事情會變得更加複雜。以x64的情況為例。跳轉到已修復函數的指令需要13個字節:10個字節用於將地址加載到寄存器中,3個字節用於跳轉到該寄存器的位置。因此,攔截器需要將至少前13字節的指令移動到一個蹦床函數中,如果需要的話,還要加上完成最後一條指令所需的足夠的字節。之所以被稱為蹦床,因為通常代碼會跳轉到那裡,這會導致一些指令運行,然後跳轉到目標函數的其餘部分。讓我們看看一個真實的示例,下面是我們要截取的一個簡單函數,首先是C源代碼(Godbolt編譯器資源管理器鏈接):

5.png

以上是用-O3編譯的,所以它有點密集:

6.png

現在,從fn()開始計算13個字節將我們置於lea eax,[rdi+rdi*2]指令的中間,因此我們必須將所有內容複製到蹦床上。

最終結果如下所示:

7.png

如果Firefox 修復函數想要調用未修復的fn(),那麼修復程序已經存儲了蹦床的地址(在本例中為0x3000000)。在C++代碼中,我們將其封裝在FuncHook類中,修復後的函數可以使用與普通函數調用相同的語法來調用蹦床。

整個過程比第一種情況要復雜得多,你可以看到第一個示例的修復只有200行左右,而處理這個示例的修復有1700多行,不過有些注意事項要注意:

1.並非所有轉移到蹦床上的指令都必須保持完全相同,一個示例是跳轉到一個沒有移動到蹦床的相對地址,由於指令已經在內存中移動了,修復程序需要用絕對跳躍來代替它。修復程序並不能處理所有類型的x64指令,否則它必須更長!但研究人員已經進行了自動化測試,以確保能夠成功攔截所知道Firefox需要的Windows函數。

2.研究人員專門使用了r11來加載修復函數的地址,因為根據x64調用約定,r11是一個不需要被調用方保存的易失性寄存器。

3.由於我們使用jmp從fn()返回到修復函數,而不是ret,並且類似地從蹦床返回到fn()的主代碼,這使代碼堆棧保持中立。因此,調用其他函數和從fn()返回都可以正確地處理堆棧的位置。

4.如果從fn()的後面跳轉到前13個字節,這些字節現在將跳轉到修復函數的中間,肯定會發生問題。幸運的是,這是非常罕見的。大多數函數在開始時都在進行函數序言操作,所以對於Firefox攔截的函數來說,這不是問題。

5.類似地,在某些情況下,fn()在前13個字節中存儲了一些數據,這些數據將被後面的指令使用,將這些數據移動到蹦床將導致後面的指令獲得錯誤的數據。我們已經遇到了這個問題,如果我們可以在前2GB的地址空間內為蹦床分配空間,那麼可以通過使用較短的mov指令來解決這個問題。這將導致10字節的修復而不是13字節的修復,在許多情況下,這足以避免問題。

其他一些需要注意的複雜情況:

6.Firefox也有一種跨進程攔截的方法;

7.對於Control Flow Guard安全措施來說,蹦床很棘手:由於它們是合法的間接調用目標,在編譯時不存在,所以需要特別注意允許Firefox修復過的函數調用它們;

8.蹦床還包括一些額外的異常處理;

9.如果DLL在阻止列表中,我們的修復版本NtMapViewOfSection()將返回映射失敗,這將導致整個DLL加載失敗。這不會阻止所有類型的注入,但它確實阻止了大多數注入;

一些DLL將通過修改firefox.exe的導入地址表來自我注入,該表是firefox.exe調用的外部函數的列表。如果其中一個函數加載失敗,Windows將終止Firefox進程。因此,如果Firefox檢測到這種注入並想要阻止DLL,我們將把DLL的DllMain()重定向到一個什麼都不做的函數。

總結希望讀者在閱讀本文後,可以讓Firefox用戶更加安全地訪問互聯網。用戶大可不必在卸載有用的第三方產品和Firefox的穩定性問題之間做出選擇,現在用戶有了第三種選擇,即保留第三方的產品並阻止其註入Firefox!

APT_Apple_SL_Feat-1200x600.jpg

今年6月,卡巴斯基的研究者就發現有攻擊者利用iMessage來傳播惡意軟件,iOS 15.7以及此前版本均受到影響。研究人員通過mvt-ios(iOS 移動驗證工具包)分析受攻擊的設備之後,發現他們可以通過iMessage發送信息,受害者在接收到信息之後,不需要任何用戶交互,就能觸發系統內漏洞,從而執行任意惡意代碼。研究人員將這個攻擊活動稱為'Triangulation活動'。

加图1.png

Triangulation活動的首次公開報導請看這篇文章,正如研究人員在三角測量行動的第一篇文章中提到的,最初發現的受攻擊設備正是在莫斯科總部工作的卡巴斯基員工。所有這些設備都連接到公司的Wi-Fi網絡,這樣研究人員就可以記錄和檢查網絡流量。在花了一些時間調查Wireshark之後,研究人員最終發現了以下內容:

1.在表現出可疑行為之前,連接到iMessage服務器的設備通常負責接收信息和下載附件;

2.在下載了可能是附件的幾千字節數據後,這些設備建立了與服務器backuprabbit[.]com的連接,在不到一分鐘的時間內與服務器交換數據;

3.接下來,設備連接到以下服務器進行更長的會話:

cloudsponcer[.]com

snoweeanalytics[.]com

topographyupdates[.]com

unlimitedteacup[.]com、

virtuallaughing[.]com

4.設備重啟後,所有可疑活動都停止了;

所有與服務器的通信都是通過HTTPS進行的,所以研究人員無法從流量中恢復任何額外的細節。

設備映像由於所有的設備都觸手可及,研究人員下一步就是檢查它們的內容。不幸的是,研究時可用的取證採集軟件基於checkra1n和類似的漏洞,不適用於運行iOS 15和16的現代處理器。

檢查備份研究人員下一步決定使用設備的iTunes備份來代替完整的設備映像,這一程序必須在相當保密的情況下進行,以免提醒攻擊者。

由於研究人員不知道攻擊者的確切能力,只能默認他們在監聽設備的麥克風,閱讀電子郵件和即時通信對話。所以,研究人員不得不親自安排會議,把手機放在飛機模式下,有時放在法拉第包裡。研究人員使用libimobiledevice的優秀工具來獲取備份,並通過使用移動驗證工具包構建事件時間軸來檢查它們,該時間軸結合了文件系統時間戳和從各種系統數據庫中提取的數據記錄。研究人員專注於iMessage目錄,因為早在2021年,Citizen Lab的研究人員通過檢查這些目錄中的文件發現了FORCEDENTRY漏洞。

Triangulation活動背後的攻擊者非常隱蔽,研究人員在備份中沒有發現任何漏洞利用的跡象,他們還搜索了惡意軟件的可執行文件,但也沒有找到。

不過,研究人員還是發現了可疑網絡活動的時間戳。為此,他們開始尋找時間軸上發生在同一時間的重複事件。結果,研究人員發現了一個看起來像新指示器的東西,數據使用記錄提到了一個名為“BackupAgent”的系統進程,不過這個進程根本不應該被執行,因為二進製文件在幾年前就被棄用了。

1.png

在設備日誌中觀察到的來自BackupAgent進程的異常活動,研究人員在Triangulation 活動的第一篇文章中就分享過這個片段。

基於這個異常的發現,研究人員編寫了第一版的triangle_check工具,它使研究人員能夠快速確認設備的備份是否包含潛在攻擊的痕跡。

試圖攔截惡意iMessage進一步查看事件時間軸,研究人員發現了第二個痕跡,在BackupAgent進程使用數據之前,修改了一個空的SMS附件目錄。由於目錄被修改了,但不包含任何文件,這通常意味著可以高度肯定最後一個操作是文件刪除,有一個傳入的附件,它被刪除幾秒後,名為BackupAgent的進程正在運行可疑的網絡代碼。

由於Triangulation 活動背後的攻擊者似乎足夠聰明,可以從受攻擊的設備中刪除惡意附件,因此研究人員決定嘗試在iMessage傳遞過程中捕獲傳入消息。在尋找攔截imessage的方法時,研究人員發現了谷歌Project Zero團隊編寫的Frida腳本。它是為Mac電腦設計的,所以研究人員拿了一台備用的Mac mini,在上面安裝了Frida。然後,研究人員要求幾位目標同事用他們的蘋果id登錄Mac mini。這樣,研究人員能夠監控和攔截他們收到的imessage,接下來要做的就是等待攻擊者再次攻擊。

與此同時,研究人員積極監控SIEM日誌,尋找可疑活動的痕跡。很快,研究人員就發現了熟悉的網絡連接,這表明一款帶有iMessage帳戶的手機成功攻擊。然而,當我們檢查Mac mini上的iMessage攔截日誌時,卻沒有消息痕跡。因此,系統無法捕獲可能包含漏洞的消息,所以我們開始尋找其他方法來捕獲惡意軟件。

在通過Mac設備攔截iMessages的計劃失敗後,研究人員決定嘗試解密之前從流量分析中識別出的C2服務器的HTTPS通信。

為此,需要做到:

搭建Linux服務器,安裝HTTPS攔截工具mitmproxy;

在幾個已知被攻擊的iOS設備上安裝了根SSL證書(研究人員之前通過mitmproxy生成的);

在這些設備上安裝Wireguard VPN客戶端,並配置它們使用研究人員的mitmproxy實例作為VPN服務器。

研究人員還開發了一個Telegram機器人,當受監控的設備被攻擊時,它會通知研究人員:

2.jpg

不幸的是,這種方法不允許研究人員攔截蘋果服務(包括iMessage)的HTTPS流量,因為iOS為此實現了SSL綁定。因此,研究人員無法解密來自VPN的iMessage流量。

捕捉JavaScript驗證器一旦攻擊者再次攻擊了其中一個目標,研究人員查看了mitmproxy日誌,注意到它成功地解密了C2服務器的流量:

3.png

研究人員希望獲得的有效負載是iOS的漏洞。但是,它是JavaScript驗證器,它只是收集有關受害瀏覽器的信息並將其發送到C2服務器。

研究人員觀察到受攻擊的設備接收響應發送到C2服務器的驗證信息的有效負載。然而,雖然研究人員能夠攔截HTTPS流量,但無法解密它。這是因為JS驗證器使用NaCl庫為C2通信實現了自己的加密層,使用的加密算法基於公鑰加密。具體來說,為了與C2服務器通信,JS驗證器如下:

1.生成一個隨機密鑰對(由私鑰和公鑰組成);

2.從生成的私鑰和C2服務器的公鑰中派生共享密鑰;

3.使用此共享密鑰加密發送到C2服務器的消息並解密從C2服務器接收到的消息。

4.png

密鑰生成為了解密C2服務器通信,有必要知道由JS驗證器隨機生成的私鑰。但是,這個密鑰保存在內存中,不會被發送到C2服務器,所以研究人員必須做一些額外的工作來解密驗證器的流量。

如上圖所示,JS驗證器通過調用nacl.box.keyPair()方法生成一個隨機密鑰對。為了解密流量,研究人員編寫了一個很小的mitmproxy附加組件,用於查找對nacl.box.keyPair()方法的調用。然後用另一個方法nacl.box.keyPair.fromSecretKey()替換它們,該方法根據提供的私鑰初始化對。

5.png

從上圖中可以看出,研究人員將私鑰硬編碼到該方法的參數中,從而隱藏驗證器的加密方案。一旦在受攻擊的設備上執行了後門驗證器,就可以解密JS驗證器的所有通信。

二進制驗證器和關於附件的提示一旦攻擊者再次攻擊了其中一個目標,研究人員就能夠分析驗證器進一步執行的有效負載。結果發現它包含兩個漏洞:一個針對WebKit,另一個針對iOS內核。這兩個漏洞的最終目標是在目標設備上啟動二進制驗證器階段。

如上所述,二進制驗證器包含一個清除惡意iMessage痕蹟的函數。具體來說,研究人員發現這個函數向SMS.db數據庫發出以下SQL請求:

6.png

條件“uti==”com.apple.watchface“”給了我們另一個提示:現在很明顯,惡意附件是.watchface文件。因此,通過更多關於附件的信息,研究人員計劃並執行了獲取附件的下一次嘗試。

發送iMessage附件的過程為了設計另一種獲取附件的策略,研究人員決定更詳細地研究發送iMessage附件的過程。這個過程包括以下幾個步驟:

1.發送方生成一個隨機的AES密鑰並用它加密附件;

2.加密的附件被上傳到iCloud;

3.iCloud加密附件的鏈接與AES密鑰一起發送給收件人,AES密鑰使用設備的公共RSA密鑰進行額外加密。

因此,要獲取惡意附件文件,研究人員必須檢索兩個組件:

1.加密的附件;

2.用於加密的AES密鑰。

獲取加密的附件非常簡單,因為可以通過mitmproxy攔截到iCloud服務器的流量。之前,研究人員寫過iOS不允許解密蘋果服務的HTTPS流量,iCloud附件鏈接卻是一個例外。

同時,AES密鑰的獲取過程相當困難。它是通過iMessage協議發送的,因此不能通過mitmproxy進行攔截。不過,研究人員發現了一種恢復附件的方法,並通過對目標設備的物理訪問提取該密鑰。研究人員使用iCloud鏈接阻止iMessage成功下載附件,因此該漏洞不會激活然後刪除附件,但AES加密密鑰將存儲在SMS.db數據庫中。

研究人員決定使用mitmproxy附加組件更改加密附件中的幾個字節。這樣,研究人員中斷了下載加密附件的過程,解密密鑰保存在SMS.db數據庫中。然後,研究人員下載了受攻擊設備的iTunes備份,並從該備份中的數據庫中提取了密鑰。結果,研究人員獲得了攻擊者發送的惡意.watchface附件,這是用於使用漏洞利用鏈的開始。

植入過程在研究人員獲得攻擊者使用的漏洞之後,剩下的就是獲得植入程序了。二進制驗證器是負責從C2服務器下載和激活植入有效負載的組件,它使用RSA和AES的組合進行通信。同樣,使用RSA意味著僅使用加密流量是不可能解密植入有效負載的。

為了與C2服務器交換數據,二進制驗證器需要:

1.生成一個隨機的AES密鑰;

2.用驗證器配置中指定的服務器的RSA公鑰加密生成的AES密鑰;

3.使用生成的AES密鑰對要發送到C2服務器的消息進行加密;

4.向C2服務器發送加密消息,並接收C2服務器的響應;

5.使用用於加密發送消息的相同AES密鑰解密響應。

驗證器用以下ARM指令加密所有數據包:

7.png

這段代碼首先執行“serialized_plist”函數,該函數為發送準備數據。執行之後,寄存器X0指向準備發送到服務器的數據。

下一個要調用的函數是“encryptData”。它有兩個參數:一個指向正在加密的數據的指針被傳遞到X0寄存器,而X1寄存器包含一個帶有配置數據(包括加密參數)的pllist。在執行這個函數之後,X0寄存器包含一個指向加密附件的指針。

為了破壞加密過程來攔截來自受攻擊設備的數據。研究人員決定將對“encryptData”函數的調用替換為NOP指令(1f2003d5)。這樣,X0寄存器的值將不會被指向加密數據的指針覆蓋,並且驗證器將向研究人員的VPN服務器發送明文數據。

就像JavaScript驗證器的情況一樣,研究人員通過擴展mitmproxy插件來修補代碼:

8.png

使用NOP修補對encryptData函數調用的mitmproxy附加代碼片段

當明文數據到達研究人員的VPN服務器時,他們會再次通過mitmproxy附加組件模擬密鑰交換和數據加密,並控制加密密鑰的值。結果,研究人員成功地解密了C2服務器發送的數據,並提取了植入程序。

獲取模塊在對TriangleDB植入程序進行逆向工程後,研究人員發現它能夠執行輔助模塊,這讓研究人員想要獲得模塊二進製文件。在對植入的分析中,發現模塊可執行文件通過CRXUpdateRecord和CRXUpdateRunRecord命令傳遞給植入程序。因此,為了獲得這些可執行文件,必須能夠解密發送到C2服務器的所有命令。

同樣,加密算法是基於RSA的,所以研究人員的操作類似於獲取植入程序二進製文件的操作。

不過這一次,研究人員決定:

1.生成自己的RSA公鑰/私鑰對;

2.將植入配置中的RSA公鑰替換為先前生成的公鑰。

研究人員將以下代碼添加到mitmproxy插件中:

9.png

當植入流量到達研究人員的VPN服務器時:

1.用研究人員生成的RSA私鑰解密它;

2.保存解密後的流量;

3.使用攻擊者使用的公鑰對流量重新加密。

通過這種方式,研究人員能夠監控由植入程序執行的所有通信,並獲得模塊二進製文件。

總結研究人員調查Triangulation活動的過程相當漫長,總共花了幾個月的時間。儘管經歷了許多波折,研究人員最終還是設法獲得了這次攻擊中使用的所有階段,包括向蘋果報告的四個零日漏洞,兩個驗證器,一個植入程序及其模塊。

在此過程中,研究人員對iOS內部進行了大量研究,並提出了許多有趣的技術,例如研究人員用於提取iMessage附件的技術。研究人員在研究過程中遇到的主要困難是處理在攻擊鏈的每個階段都使用的公鑰加密。為了繞過加密,研究人員必須開發一個mitmproxy附加組件。

在本文中,我們將以ANYTONE 878UVII對講機中的固件為例,為大家演示如何對ARM固件映像進行逆向分析。不過,本文中的大部分內容,對於ARM架構來說都是通用的。

本文假設讀者已經熟悉IDA Pro,並且至少分析過一些普通的二進製文件。如果您還不熟悉IDA,只需在網上搜索一下,就能找到許多非常優秀的入門教程,大家可以先通過它們來掌握相關的基礎知識。

固件映像就本文來說,我們只需IDA Pro和ANYTONE 878UVII對講機的固件映像就能搞定我們的實驗。並且,所需的映像還可以從分銷商網站下載。實際上,下載哪個版本並不重要,但本文是將以2.04版本為例進行介紹。

1.png

在下載的更新包中,我們可以找到FW文件夾,其中包含三個文件:CDI、SPI和CDD文件。其中,CDD是最大的文件,它實際上就是我們要分析的固件映像。

這次我們的運氣不錯,因為這個固件映像並沒有加密,否則,事情就會麻煩一些。它只是內部閃存中的映像,甚至連文件頭都沒有。並且,該文件的元數據被拆分為單獨的文件。所以,我們可以直接在IDA Pro中加載CDD文件。

技術背景ANYTONE 878系列對講機使用的是GigaDevice GD32 ARM Cortex-M4微控制器:通過拆開對講機,我們就能看到這些芯片的型號。

除了拆對講機外,實際上還有另一種更方便的方法:查詢FCC。如果您的設備符合FCC的要求,網上應該有關於它的公開信息。這時,我們可以直接在FCC或獨立的數據庫中搜索製造商的信息。大多數情況下,我們會找到一份帶有“內部照片”的文件。這個文件通常能夠提供我們感興趣的信息,比如芯片型號等,這樣,我們就不用拆機了。

1.png

重要的是,我們建議大家下載CPU的數據表,並保存起來供後面使用:後面步驟中需要設置的參數,都可以從中找到。

關於CPU的相關設置首先要做的是,把CDD拖到打開的IDA Pro窗口中,或者通過文件菜單打開它。 IDA會檢測出這是一個二進製文件。然後,將“Processor type”指定為“ARM little-endian”,具體如下圖所示。

1.png

現在,先別按“Ok”按鈕,因為還要對處理器選項進行一些設置。我們知道,這種設備使用的處理器是基於ARMv7E-M架構的。因此,我們必須對處理器選項做相應的修改。最佳設置如下圖所示;為此,需要按下“Processor options”菜單中的“Edit ARM architecture Options”按鈕,這樣就可以找到中間的窗格了。

1.png

由於這個項目與Thumb指令集高度相關,所以也建議在“ARM specific options”中勾選“No automatic ARM THUMB switching”選項。雖然這一點並沒有顯示在上面的截圖中,但對本項目來說的確是一個非常有用的設置。

加載映像現在,我們已經完成了基本的CPU設置。接下來,我們需要將加載的固件映像重新定位到正確的偏移量處。這個固件映像將被加載到IDA數據庫的ROM部分。由於CPU不會從文件中的0x00處開始加載映像,所以,我們必須重新定位。如果跳過這一步,交叉引用將被破壞,反彙編文件將無法正常工作。我們的目標設備中使用的ARM CPU將要求映像從偏移量0x8004000處開始。這裡其實就是映射到物理ROM的內存位置,所以,我們需要將文件映射到這個地址。

在單擊“Load new file”對話框中的Ok按鈕之後,將會出現如下所示的對話框。通常情況下,RAM的大小和ROM的大小並不需要調整。它們現在已經正確地自動填充好了。

1.png

接下來要做的事情,就是創建一個RAM分區。為此,可以勾選“Create RAM section”,分配的RAM將從0x20000000位置開始,長度為0x17FFF。

如何找到正確的內存偏移量如果讀者是第一次接觸這方面的內容,通常會有這樣的疑問:這些值是如何確定的?答案很簡單,我們可以從之前下載的數據手冊中找到它們。

從第17頁的內存映射部分,我們可以找到主閃存(固件文件)的加載地址。而在第16頁中,我們可以找到SRAM偏移量和這段內存的長度。

1.png

很簡單吧?上面所做的只是將文件/映像重新定位到從我們的數據表中獲取的正確位置。關於主閃存有一個小技巧,第一個0x4000似乎是由引導程序獲取的,所以,我們的二進製文件必須位於0x8004000處。

二進製文件的結構對於第一次使用IDA的讀者來說,感覺可能非常奇怪:它並沒有像其他軟件一樣進行自動分析,也沒有展示程序代碼,相反,它只是給出了大量的十六進製字符。難道是我們哪裡做錯了嗎?很可能不是。如果您正在使用IDA Pro分析固件映像,這是非常正常的現象。這裡的難點在於,我們必須自己從頭開始進行分析。

1.png

但這也沒有想像的那麼難。首先,讓我們考察文件的開頭位置。這是ARM CPU開始執行代碼的地方。在這個偏移量處,一個被稱為向量表的結構被定位,它在ARM Cortex通用用戶指南中有很好的詳細描述。

1.png

正如我們在用戶指南的圖形中所看到的,偏移量0x0000(0x08004000)處包含初始堆棧指針。 CPU將在這個地址加載接下來的四個字節,並將其用作指向未來堆棧的指針。

復位處理程序接下來的字節是各種處理程序,最重要的是複位處理程序(reset handler)。它正是CPU要啟動或重新啟動時將會跳轉到的地方。

1.png

它又是一個4字節的地址,對於我們的映像來說,這個地址很容易解析。正如鍊接的ARM用戶指南文章所告訴我們的,如果地址的最低有效位為1,則處理程序為Thumb。

在我們的例子中,該地址的最後一個字節是0xF9,二進制形式為11111001B。我們可以看到,這裡的最低有效位確實是1。因此,我們需要將復位處理程序的入口點改為Thumb。實際上,復位處理程序的實際偏移量也由於該位的值而移動了一個字節。

0xF9=11111001b (with Thumb indicator)

0xF8=11111000b (without)

單擊這個偏移量,就會跳轉到復位處理程序的地址減1個字節的地方。現在,請按“Alt+G”,這時會打開一個對話框,我們需要將下面的部分定義為Thumb(CODE16)。

1.png

這個項目主要涉及Thumb指令集,因此,您也可以從ROM段的第一個字節開始使用Thumb代碼。請記住,這一點並非適用於所有的ARM項目。但對於這個項目來說,這是沒問題的。

將當前偏移量改為CODE16後,只需按“C”,就能在該偏移量處創建代碼了。現在,我們就應該可以看到復位處理程序的代碼了。

1.png

查找其他代碼和字符串上面介紹的方法雖然能用,但是通過手動方式來創建所有的代碼是相對繁瑣的。別擔心,我們可以藉助於腳本來完成這些任務。實際上,Maddie Stone已經為IDA Pro創建了許多非常方便的腳本,能夠給我們帶來極大的便利。

由於她的腳本不能用於較新的IDA版本(在寫這篇文章時,最新的版本為7.7),所以,我們專門把適用於IDA 7.x版本的腳本上傳到了Github上,讀者可以從https://github.com/alexander-pick/IDAPythonEmbeddedToolkit下載。為了支持基於ARM的項目,我已經對這些代碼做了相應的處理。

首先,我們可以使用腳本define_code_functions.py,在0x08004000到0x080963DC大致範圍內創建代碼。如果腳本詢問是否要撤銷現有的代碼,請選擇No。

IDA Pro應該可以正常工作了,此時的ROM部分應該開始變得更有趣了。

1.png

接下來,我們可以使用make_strings.py腳本,在ROM的其餘部分創建字符串。這時,你會在其中發現許多我們感興趣的字符串。

關於字符串引用分析這個固件時,我們會發現一個奇怪的現象。由於ANYTONE的開發人員為多國語言創建了固件,所以,他們使用了引用表。因此,這可能導致我們會遺漏某些字符串的引用。之所以會發生這種情況,是因為這些字符串是根據選擇的語言來動態加載的。遺憾的是,基於IDA的靜態分析是無法解決這個問題的。

不過,引導過程中的一些字符串是直接嵌入的,所以它們解析起來問題不大。因此,我們可以從這些字符串開始下手。

1.png

為了做進一步的分析,我們需要能夠識別一些基本的OS函數,即操作嵌入字符串的函數,比如“print”或“read”函數等。當然,類似“memcpy”這樣的函數在各種操作系統中都是非常常見的。

非常值得注意的是“print_string”函數(一旦識別出來,我就把它重命名為這個名字)。它接受一些坐標和一個字符串作為參數,並將字符串顯示在屏幕上給定的位置處。這個函數在啟動菜單中被大量使用。

從固件鏡像中的字符串可以識別出設備使用的RTOS(實時操作系統)是μC/OS-II。 μC/OS-II是一個用ANSI C編寫的免費實時操作系統。關於該系統的進一步介紹,以及相關文檔,讀者可以在這裡找到;而相關代碼則可以從這裡下載。感興趣的讀者可以參考這些資料,它們應該對您有很大的幫助。

I/O和外圍設備像這樣基於ARM的CPU通常使用特殊的內存區域來處理地址總線、GPIO、I/O或簡單的定時器和時鐘,具體請參閱數據表。實際上,在第14頁中,大家可以找到我們用來指定加載偏移量的內存映射。該映射還包含要添加到數據庫中的特殊內存區域。

打開IDA中的內存區域視圖(segments view)並將它們添加到數據庫中,結果應該與下圖類似。如果你想偷懶,則可以使用這個IDC(https://github.com/alexander-pick/useful-script-and-code/blob/master/GD32F303xx_segments.idc)來完成這個過程。

1.png

現在,請重新運行自動分析(Options - General - Reanalyse program)以創建交叉引用。

一旦你完成了上面的步驟,就可以查看感興趣的內存區域,看看是否有對它們的交叉引用。這些可以幫助您找到使用特定總線、GPIO或I/O的函數。

如果您查找操作UART的函數,只需檢查UART區域,就會找到對它的引用。這在沒有或只有很少字符串作為引用的情況下是特別有用的。

小結我認為,到目前為止,您應該已經具備了自己研究這一主題所需的一切。請隨時給我留言。如果您還有什麼問題,儘管問。我總是很高興看到人們分享有趣的發現。

閱讀愉快!

為您的軟件建立強大的安全性至關重要。惡意行為者不斷使用各種類型的惡意軟件和網絡安全攻擊來破壞所有平台上的應用程序。您需要了解最常見的攻擊並找到緩解它們的方法。

本文不是關於堆溢出或堆利用的教程。在其中,我們探討了允許攻擊者利用應用程序中的漏洞並執行惡意代碼的堆噴射技術。我們定義什麼是堆噴射,探索它的工作原理,並展示如何保護您的應用程序免受它的影響。

什麼是堆噴射技術,它是如何工作的?堆噴射是一種用於促進執行任意代碼的漏洞利用技術。這個想法是在目標應用程序中的可預測地址上提供一個shellcode,以便使用漏洞執行這個shellcode。該技術是由稱為heap spray的漏洞利用源代碼的一部分實現的。

在實現動態內存管理器時,開發人員面臨許多挑戰,包括堆碎片。一個常見的解決方案是以固定大小的塊分配內存。通常,堆管理器對塊的大小以及分配這些塊的一個或多個保留池有自己的偏好。堆噴射使目標進程連續地逐塊分配所需內容的內存,依靠將shellcode 放置在所需地址的分配之一(不檢查任何條件)。

堆噴射本身不會利用任何安全問題,但它可用於使現有漏洞更容易被利用。

必須了解攻擊者如何使用堆噴射技術來了解如何緩解它。以下是普通攻擊的樣子:

image.png

堆噴射如何影響進程內存

堆噴射攻擊有兩個主要階段:

1.內存分配階段。一些流連續分配大量具有相同內容的固定大小的內存塊。

2.執行階段。這些堆分配之一接收對進程內存的控制。

如您所見,堆噴射漏洞利用技術看起來像連續的垃圾郵件,形式為大小相同且內容相同的塊。如果堆噴射攻擊成功,控制權將傳遞給這些塊之一。

為了執行這種攻擊,惡意行為者需要有機會在目標進程中分配大量所需大小的內存,並用相同的內容填充這些分配。這個要求可能看起來過於大膽,但最常見的堆噴射攻擊案例包括破壞Web 應用程序漏洞。任何支持腳本語言的應用程序(例如,帶有Visual Basic 的Microsoft Office)都是堆噴射攻擊的潛在受害者。

因此,在一個流的上下文中預期攻擊是有意義的,因為腳本通常在單個流中執行。

但是,攻擊者不僅可以使用腳本語言執行堆噴射攻擊。其他方法包括將圖像文件加載到進程中,並通過使用HTML5 引入的技術以非常高的分配粒度噴射堆。

這裡的問題是哪個階段可疑,我們可以乾預並試圖弄清楚是否存在正在進行的攻擊?

內存分配階段,當一些流填滿大量內存時,已經很可疑了。但是,您應該問自己是否可能存在誤報。例如,您的應用程序中可能存在確實在一個循環中分配內存的腳本或代碼,例如數組或特殊內存池。當然,腳本在完全相同的堆塊中分配內存的可能性很小。但是,它仍然不是堆噴射的關鍵要求。

相反,您應該注意執行階段,因為分析接收進程內存控制權的堆分配總是有意義的。因此,我們的分析將特別關注包含潛在shellcode 的分配內存。

為了將堆噴射shellcode 的執行與普通JIT代碼生成區分開來,您可以分析分配某個內存塊的最新流分配,包括流中的相鄰分配。請注意,堆中的內存始終分配有執行權限,這允許攻擊者使用堆噴射技術。

堆噴射緩解基礎知識為了成功緩解堆噴射攻擊,我們需要管理接收內存控制的過程,應用鉤子,並使用額外的安全機制。

保護您的應用程序免受堆噴射執行的三個步驟是:

1.攔截NtAllocateVirtualMemory調用

2.在嘗試分配可執行內存期間使其無法執行

3.註冊結構化異常處理程序(SEH) 以處理由於執行不可執行內存而發生的異常

現在讓我們詳細探討每個步驟。

接收對內存的控制我們既需要監控目標進程如何分配內存,又需要檢測動態分配內存的執行情況。後者假設在堆噴射期間分配的內存具有執行權限。如果數據執行保護( DEP ) 處於活動狀態(對於x64,默認情況下始終處於活動狀態)並且嘗試執行沒有執行權限分配的內存,則會生成異常訪問衝突。

惡意shellcode 可以預期在沒有DEP 的應用程序中執行(這不太可能),或者使用腳本引擎在默認情況下具有執行權限的堆中分配內存。

我們可以通過攔截可執行內存的分配並以分配它的漏洞無法察覺的方式使其不可執行來防止惡意代碼的執行。因此,當漏洞利用認為噴射是安全的執行並嘗試將控制權委託給噴射的堆時,將觸發系統異常。然後,我們可以分析這個系統異常。

首先,讓我們從用戶模式進程的角度來探索Windows 中的內存工作是什麼樣的。以下是通常分配大量內存的方式:

image.png

在哪裡:

马云惹不起马云 HeapAlloc和RtlAllocateHeap是從堆中分配一塊內存的函數。

马云惹不起马云NtAllocateVirtualMemory是一個低級函數,它是NTDLL 的一部分,不應直接調用。

马云惹不起马云sysenter是用於切換到內核模式的處理器指令。

如果我們設法替換NtAllocateVirtualMemory,我們將能夠攔截進程內存中的堆分配流量。

應用掛鉤為了攔截目標函數NtAllocateVirtualMemory的執行,我們將使用mhook 庫。您可以選擇原始庫或改進版本。

使用mhook 庫很容易:您需要創建一個與目標函數具有相同簽名的鉤子,並通過調用Mhook_SetHook來實現它。鉤子是通過在函數體上使用jmp指令覆蓋函數prolog來實現的。如果您已經使用過鉤子,那麼您應該沒有任何困難。

安全機制有兩種安全機制可以幫助我們緩解堆噴射攻擊:數據執行預防和結構化異常處理。

結構化異常處理或SEH是一種特定於Windows 操作系統的錯誤處理機制。當發生錯誤(例如,除以零)時,應用程序的控制權被重定向到內核,內核會找到一系列處理程序並逐個調用它們,直到其中一個處理程序將異常標記為“已處理”。通常,內核將允許流程從檢測到錯誤的那一刻起繼續執行。

從進程的角度來看,DEP 看起來像是在內存執行時出現EXCEPTION_ACCESS_VIOLATION 錯誤代碼的SEH 異常。

對於x86 應用程序,我們有兩個陷阱:

DEP可以在系統參數中關閉。

马云惹不起马云 指向處理程序列表的指針存儲在堆棧中,它提供了兩個潛在的攻擊向量:處理程序指示器覆蓋和堆棧替換。

马云惹不起马云 在x64 應用程序中,不會出現這些問題。

防止堆噴射攻擊現在,讓我們開始練習。為了減輕堆噴射攻擊,我們將採取以下步驟:

1.形成分配歷史

2.檢測shellcode 執行

3.檢測噴霧

形成分配歷史為了攔截動態分配內存的執行,我們將PAGE_EXECUTE_READWRITE 標誌更改為PAGE_READWRITE。

讓我們創建一個結構來保存分配:

image.png

接下來,我們將為NtAllocateVirtualMemory定義一個鉤子。此掛鉤將重置PAGE_EXECUTE_READWRITE 標誌並保存已重置標誌的分配:

image.png

一旦我們設置了鉤子,任何帶有PAGE_EXECUTE_READWRITE 位的內存分配都會被修改。當試圖將控制權傳遞給該內存時,處理器將生成一個我們可以檢測和分析的異常。

在本文中,我們忽略了多線程問題。然而,在現實生活中,最好單獨存儲每個流的分配,因為shellcode 執行預計是單線程的。

檢測shellcode 執行現在,我們將為SEH 註冊一個處理程序。這就是這個處理程序通常的工作方式:

1.提取觸發異常的指令的地址。如果此地址屬於我們保存的區域之一,則此異常已由我們的操作觸發。否則,我們可以跳過它,讓系統繼續搜索相關的處理程序。

2.搜索堆噴射。如果動態分配的內存被可疑執行,我們必須對檢測到的攻擊做出反應。否則,我們需要恢復原樣,以便應用程序可以繼續工作。

3.使用NtProtect函數(PAGE_EXECUTE_READWRITE)恢復區域的原始參數。

4.將控制權交還給工藝流程。

下面是一個shellcode 檢測的代碼示例:

image.png

目前,我們有一種機制可以監控應用程序中的shellcode,並可以檢測其執行時刻。在現實生活中,我們需要再執行兩個步驟:

马云惹不起马云 攔截NtProtectVirtualMemory和NtFreeVirtualMemory函數。否則,我們將沒有機會監控進程內存的相關狀態。這是一個碎片問題:我們需要存儲和更新進程的可執行內存的映射,這是一項不平凡的任務。例如,我們的應用程序可以使用NtFree函數釋放我們保存區域中間的部分頁面,或者將它們的標誌更改為NtProtect。我們需要跟踪和監控此類案件。

马云惹不起马云使用Execute 分析所有可能的標誌(一組允許我們執行內存內容的可能值),例如PAGE_EXECUTE_WRITECOPY 標誌。

檢測堆噴射使用上面的代碼,我們在動態內存執行時停止了一個應用程序,並獲得了最新分配的歷史記錄。我們將使用這些信息來確定我們的應用程序是否受到攻擊。讓我們探索一下我們的堆噴射檢測技術的兩個步驟:

马云惹不起马云首先,我們需要確定我們將存儲多少分配以及在發生異常時我們將分析其中的多少。請注意,我們對相同大小的分配感興趣。因此,如果流中的內存以不同的大小分配,我們可以允許流繼續執行,因為這不太可能是堆噴射攻擊。此外,在分配邊界之間存在空間的情況下,我們可以排除堆噴射攻擊的可能性,因為堆噴射意味著連續的內存分配。

马云惹不起马云接下來,我們需要選擇堆噴射檢測的標準。檢測堆噴射的一種有效方法是在內存分配中搜索相同的內容。這個重複的內容很可能是shellcode的副本。例如,假設我們有10,000 個分配具有相同數據的相同位移。在這種情況下,最好從接收控制的當前分配的位移開始搜索。

image.png

用於識別堆噴射的建議算法

我們建議使用所描述的技術並註意以下四個標準,以排除可能會顯著減慢您的應用程序的不必要檢查:

1.為每個線程定義已保存的內存分配數量。

2.設置已保存內存分配的最小大小。攔截大小為一頁的分配將導致不合理地節省內存。堆噴射通常使用為某個應用程序的特定堆管理器選擇的巨大值進行操作。數十頁和數百頁似乎更相關。

3.定義發生異常時將分析的最新分配數。如果我們處理過多的分配,它會降低應用程序的效率,因為對於動態內存的每次執行,我們都必須讀取大區域的內容。

4.設置shellcode 的預期最小大小。如果我們要搜索的代碼太小,就會增加誤報的數量。

結論我們探索了一種使用鉤子和內存保護機制檢測堆噴射攻擊的方法。在我們的項目中,這種方法在測試和堆噴射檢測過程中顯示出出色的效果。

如何保護您的Web 應用程序免受密碼破解Part 1

什麼是Fail2ban,它是如何工作的? Fail2ban是一種用於掃描日誌文件、檢測可疑活動(例如太多失敗的身份驗證嘗試)以及阻止潛在惡意IP 地址的工具。

這項免費服務有助於保護Linux 機器免受暴力破解和其他自動攻擊。通常,Fail2ban 用於更新防火牆規則以在指定的時間內拒絕IP 地址。

Fail2ban 有以下好處:

马云惹不起马云易於設置

马云惹不起马云免費使用

马云惹不起马云可以與大量應用程序交互

马云惹不起马云提供大量配置參數

马云惹不起马云易於監控當前保護狀態

马云惹不起马云與各種通知服務集成

儘管Fail2ban 可以幫助您最大限度地減少錯誤身份驗證嘗試的次數,並在一定程度上降低密碼破解和未經授權訪問的風險,但它並不是靈丹妙藥。

不利的一面是,Fail2ban 無法涵蓋由於服務器身份驗證策略薄弱而出現的問題。即使是最好的Fail2ban 配置也不能替代我們上面討論的密碼保護最佳實踐。此外,Fail2ban 僅適用於Linux,不適用於IPv6。

為了有效地保護您的服務,您還可以應用用於多因素和公共/私人身份驗證機制的工具。

image.png

Fail2ban 的優缺點

Fail2ban 是如何工作的?下面簡單解釋一下它的機制:

1. 任何應用程序或服務器總是將日誌保存在特定文件中,包括失敗的身份驗證嘗試的唯一日誌。

2. Fail2ban 掃描這些文件,搜索與身份驗證失敗相關的日誌。

3. 如果檢測到失敗的身份驗證嘗試,Fail2ban 會保存嘗試的時間和負責的IP 地址。

4. Fail2ban 計算在指定時間段內來自同一IP 的失敗身份驗證嘗試。

5. 如果IP 地址超過了允許的嘗試次數,Fail2ban 會創建一個新的防火牆規則來阻止該IP 地址。

結果,可疑的IP 地址將失去訪問服務器的能力。經過一段可配置的時間後,IP地址可以自動解禁,也可以手動解禁。

例如,您可以配置Fail2ban,如果任何威脅行為者發起密碼破解攻擊,他們的IP 地址將被禁止五個小時。

現在,讓我們探索配置過程本身。

如何配置Fail2ban您可以配置Fail2ban 以讀取不同應用程序的日誌。開箱即用,此工具可以與以下應用程序類型交互:

马云惹不起马云SSH 服務器

马云惹不起马云HTTP 服務器

马云惹不起马云Webmail 和群件服務器

马云惹不起马云網絡應用

马云惹不起马云HTTP 代理服務器

马云惹不起马云FTP 服務器

马云惹不起马云郵件服務器

马云惹不起马云郵件服務器驗證器

马云惹不起马云DNS 服務器

马云惹不起马云來自不同類別的各種服務器應用程序

默認情況下,Fail2ban 啟用使用sshd的通信,這是一個OpenSSH 服務器進程。這意味著在幾次失敗的SSH 身份驗證嘗試後,負責的IP 地址將被禁止。

為了與任何應用程序交互,Fail2ban 使用Jail,它是一個過濾器和一個或多個操作的組合。此交互允許您在身份驗證嘗試失敗後禁止IP 地址。

監獄配置默認保存到jail.conf 文件。如果要更改默認設置,請複製配置文件並將副本命名為jail.local。如果jail.local 文件存在,Fail2ban 將自動使用它而不是默認文件。

我們不建議對原始配置文件進行更改,因為萬一出現任何錯誤,返回默認設置將非常困難。此外,一旦安裝了Fail2ban 的新更新,jail.conf 文件也將更新,您的所有自定義設置都將消失。

以下是Fail2ban 如何確定失敗的身份驗證嘗試:

1. 該工具具有寫入jail.local 配置文件中的服務日誌文件的路徑。

2. 失敗的身份驗證日誌和常規異常會自動添加到Fail2ban 文本過濾器中。

3. 該工具使用文本過濾器掃描日誌文件。

如果您打開配置文件,您會發現Fail2ban 可以與之交互的相當大的應用程序列表。這些應用程序的名稱在括號中,如下面的示例代碼所示:

#Mailservers

[assp]

port=smtp,465,submission

logpath=/root/path/to/assp/logs/maillog.txt

[courier-smtp]

port=smtp,465,submission

logpath=%(syslog_mail)s

backend=%(syslog_backend)s

[postfix]

#Touseanothermodessetfilterparameter'mode'injail.local:

mode=more

port=smtp,465,submission

logpath=%(postfix_log)s

backend=%(postfix_backend)s

[postfix-rbl]

filter=postfix[mode=rbl]

port=smtp,465,submission

logpath=%(postfix_log)s

backend=%(postfix_backend)s

maxretry=1默認情況下,Fail2ban 配置為僅與SSH 一起使用,並且所有其他通信協議都被禁用。如果需要開啟其他類型的通信,在配置文件中找到需要的類型,添加如下字符串:

enabled=true這是一個例子:

[nginx-http-auth]

enabled=true

port=http,https

logpath=%(nginx_error_log)s如果需要,您還可以更改與某個應用程序交互的現有參數或添加新參數。以下是常用參數列表:

马云惹不起马云ignoreip指定Fail2ban 忽略的IP 地址。默認情況下,該參數設置為忽略當前機器的流量。

马云惹不起马云bantime 以秒為單位設置禁令持續時間。默認值為600 秒。

马云惹不起马云findtime定義了監控來自每個IP 地址的失敗身份驗證嘗試的時間段。默認值為600 秒。

马云惹不起马云maxretry指定在findtime 指定的時間內每個地址的失敗登錄嘗試限制。

马云惹不起马云usedns確定是否使用反向DNS 進行阻止。如果設置為NO,則Fail2ban 將阻止IP 地址而不是主機名。如果設置為YES,該工具將嘗試使用反向DNS 來查找主機名並阻止它。默認值為WARN。它就像YES 值一樣工作,但也會記錄一個警告。系統工程師可以稍後查看所有警告。

马云惹不起马云協議指定將被阻止的流量類型。默認情況下它是TCP。

马云惹不起马云port指定要禁止的端口。

马云惹不起马云logpath顯示日誌文件的路徑。

注意:上面的列表沒有描述所有的Fail2ban 參數。您可以在配置文件中找到所有這些。

您可以在/etc/fail2ban 文件夾中的文件中找到在logpath參數中默認設置的日誌文件路徑(例如,上面代碼示例中的nginx_error_log ):

马云惹不起马云paths-common.conf — 具有默認服務日誌路徑的文件

马云惹不起马云path-opensuse.conf、paths-arch.conf、paths-debian.conf — 包含不同Linux 系統的特定路徑的文件

如果您打開上述文件,您可以看到類似於以下的日誌文件路徑:

apache_error_log=/var/log/apache2/*error.log

apache_access_log=/var/log/apache2/*access.log

auditd_log=/var/log/audit/audit.log

exim_main_log=/var/log/exim/mainlog

nginx_error_log=/var/log/nginx/*error.log

nginx_access_log=/var/log/nginx/*access.log如有必要,您可以編輯指示應在日誌中搜索哪些文本以確定身份驗證失敗的過濾器。每個過濾器都位於/etc/fail2ban/filter.d 文件夾中的一個單獨文件中。

image.png

截圖1. /etc/fail2ban/filter.d文件夾內的過濾器列表

當您打開任何過濾器文件時,您將看到一個帶有所需身份驗證失敗文本的正則表達式,如下例所示:

image.png

屏幕截圖2. 過濾驗證失敗的文本

配置完成後,使用以下命令重新加載Fail2ban:

sudofail2ban-clientreload如果您只更改了一個Jail文件的設置,則無需重新啟動該工具。只需使用以下命令重新加載它:

image.png

此外,您可以配置Fail2ban 以與配置文件中不存在的任何應用程序進行交互。您需要做的就是添加您的自定義配置,如上所述。

如何使用Fail2ban要檢查當前啟用了哪些監獄,請使用以下命令:

sudofail2ban-clientstatus這是響應的示例:

Status

|-Numberofjail:2

`-Jaillist:nginx-http-auth,sshd如您所見,服務器上啟用了nginx-http-auth 和sshd Jails 。如果要查看任何Jail參數的值,則無需打開配置文件;只需使用以下命令:

image.png

這是一個代碼示例,它向我們展示了sshd Jail maxretry 等於5:

sudofail2ban-clientgetsshdmaxretry5如果監獄超過了失敗的身份驗證嘗試限制,Fail2ban 將禁止在監獄配置中為IP 地址指定的端口。要檢查監獄狀態,請使用以下命令:

image.png

下面是一個響應示例,它向我們展示了兩個IP 地址當前被禁止SSH 訪問:

Statusforthejail:sshd

|-Filter

||-Currentlyfailed:0

||-Totalfailed:25

|`-Filelist:/var/log/auth.log

`-Actions

|-Currentlybanned:2

|-Totalbanned:5

`-BannedIPlist:192.168.10.107192.168.10.115如果您在IP 在禁止列表中時嘗試訪問服務器,則會收到如下“連接被拒絕”錯誤:

ssh:connecttohost192.168.10.105port22:Connectionrefused如果IP 地址被任何HTTP 服務器Jail禁止,錯誤將類似:

curl:(7)Failedtoconnectto192.168.10.105port80:Connectionrefused您還可以使用以下命令手動將任何IP 地址添加到禁止列表:

image.png

這是一個例子:

sudofail2ban-clientsetnginx-http-authbanip10.100.1.210要手動解禁IP 地址,請使用以下命令:

image.png

這是一個例子:

sudofail2ban-clientsetnginx-http-authunbanip10.100.1.210考慮到這一點,讓我們開始在Fail2ban 中配置通知。

如何配置Viber 聊天機器人以接收Fail2ban 通知如果要監控Fail2ban 活動,請通過以下三個步驟配置實時活動通知:

1. 配置您要使用的任何通知服務

2. 準備Fail2ban 動作配置文件

3. 在jail.local 文件中更新action參數的值

Fail2ban 具有使用電子郵件服務的配置。您需要做的就是在服務器上配置服務。

但是,如果您想通過Viber 等信使服務接收通知怎麼辦?讓我們討論如何配置它!

首先,要將Viber 用作通知服務,您需要創建一個Viber 聊天機器人。您可以在Viber API 文檔頁面上找到有關Viber 聊天機器人設置和配置的文檔。

準備好聊天機器人後,請確保執行以下步驟:

1. 獲取Viber 聊天機器人的身份驗證令牌。您可以在Viber 管理面板頁面上找到它。

2.在訂閱Viber 聊天機器人的所有用戶列表中找到您的用戶ID。為此,請使用以下HTTP 請求:

image.png

響應將向您顯示成員列表,如下例所示:

'members':[{'id':'','name':'JohnDoe','role':'admin'}]選擇必要成員的ID 並複制。

現在,您可以開始配置Fail2ban。轉到/etc/fail2ban/action.d 文件夾,其中包含所有可能的Fail2ban 操作的配置。

為Viber 通知創建一個新的配置文件。我們將其命名為viber_notifications.conf。現在將以下內容添加到文件中:

image.png

讓我們弄清楚上面的字符串是什麼意思以及我們可以配置什麼:

马云惹不起马云actionban和actionunban參數描述了當Fail2ban 禁止或解禁可疑IP 地址時需要執行的操作。在我們的例子中,HTTP 請求會將消息從您的Viber 聊天機器人發送給您指定的用戶。

马云惹不起马云 Auth Token 和user id 是我們之前討論過的參數。只需粘貼您的身份驗證令牌和您複製的用戶名。

马云惹不起马云sender是配置通知發送者名稱的參數。在我們的示例中,我們使用名稱“Fail2ban”。

马云惹不起马云type是幫助您配置消息類型的參數。您可以使用Viber 發送不同的消息類型。在我們的示例中,我們使用文本類型。

马云惹不起马云text是一個參數,其中包含機器人將發送的消息。您可以向文本添加不同的變量。例如, ip 代表被禁止的IP 地址、 name 監獄名稱和failures 失敗次數。

马云惹不起马云name=default是一個字符串,表示將動態分配監獄名稱

我們的下一步是配置jail.local。為此,您需要在必要的Jail部分中添加操作參數或更新[DEFAULT]部分中的默認參數。該參數應包含兩個操作:第一個用於IP 禁止,第二個用於Viber 通知。

下面是一個使用action參數的例子

action=%(action_)s

viber_notifications注意:%(action_)s是默認操作值。此操作將禁止IP 地址。讓我們將Viber 操作配置名稱“viber_notifications”添加到第二個字符串。

現在,由於jail.conf 文件發生了變化,您需要重新加載Fail2ban 客戶端並重新啟動服務:

sudofail2ban-clientreload

systemctlrestartfail2ban聊天機器人將如下所示:

screenshot-3-Fail2ban-notifications-in-a-viber-chatbot.png

屏幕截圖3. Viber 聊天機器人中的Fail2ban 通知

配置完成。現在您可以使用Viber 聊天機器人實時監控Fail2ban 活動!

結論密碼破解攻擊是對任何應用程序的嚴重威脅。惡意行為者使用不同的方法來未經授權訪問用戶帳戶並竊取用戶的敏感數據。

為了保護您的應用程序免受此類威脅,請應用嚴格的身份驗證策略並使用Fail2ban 等服務設置可靠的密碼破解保護。

在Apriorit,我們在構建每個項目時都考慮到網絡安全。我們的Web 應用程序開發和質量保證專家已經掌握了威脅保護應用程序的開發以及包括Fail2ban 在內的不同安全服務的配置。

惡意行為者通常以用戶和管理員憑據為目標,因為黑客希望使用它們來訪問敏感數據。據Verizon 稱,在2021 年受到社會工程攻擊的數據中,憑據攻擊佔高達85%。為了竊取用戶憑據,黑客可以使用惡意軟件或各種密碼破解方法。

密碼策略薄弱和密碼破解缺乏保護是導致帳戶洩露的兩個最常見的漏洞。

在本文中,我們討論了密碼破解的危險,並提供了減少惡意身份驗證嘗試的最佳實踐。我們還探討了Fail2ban 服務如何幫助您保護對用戶帳戶的訪問,並提供有關如何配置Fail2ban 的分步指南,並分享我們自己在Viber 聊天機器人中配置Fail2ban 通知的經驗。

什麼是密碼破解?要訪問Web 應用程序,用戶需要在系統內創建配置文件。為此,用戶通常會創建一個登錄名和密碼作為保護帳戶訪問的憑據。根據應用程序類型,他們可能還必須提供其他數據,例如個人信息、消息和銀行賬戶。所有這些數據對威脅參與者都很有價值,他們可以嘗試使用各種密碼竊取方法從不同的應用程序訪問用戶配置文件。

在開發Web 應用程序時,必須牢記密碼被盜的風險並實施強大的安全機制來減輕這些風險。否則,如果攻擊者設法訪問用戶帳戶並暴露個人信息,Web 應用程序提供商可能會面臨客戶流失和聲譽受損等後果。如果用戶決定將案件告上法庭,他們也可能承擔經濟損失。

image.png

密碼破解的後果

竊取用戶數據的一種方法是密碼破解。

這種方法的主要目標是猜測應用程序或計算機服務的密碼。該技術本身並不一定是惡意的,它可以作為一種目標漏洞驗證技術用於安全測試。

密碼破解是從存儲在計算機系統中或通過網絡傳輸的密碼哈希中恢復密碼的過程。它通常在評估期間執行,以識別密碼較弱的帳戶。

——NIST SP 800-115信息安全測試和評估技術指南

在應用密碼破解技術時,黑客經常使用特殊的應用程序和工具來應用多種憑證變體,直到找到正確的配對。密碼破解應用程序每秒用於猜測密碼的憑據數量取決於攻擊者計算機的性能。此外,猜測用戶密碼所需的時間取決於密碼強度。

有多種密碼破解方法:image.png

密碼破解攻擊的類型

字典攻擊是一種通過系統地輸入字典中的每個單詞作為密碼來訪問IT 資源的方法。黑客經常使用破解字典,其中存儲了常用的密碼和熟悉的單詞,例如不同語言的名稱和地點。此類字典還可以包括黑客收集和添加的先前被盜的用戶憑據。字典攻擊是猜測弱密碼的一種快速方法,但通常對於不常見的強密碼它們不會成功。

蠻力攻擊是一種簡單的試錯法,專注於生成所有可能的密碼,直到一定長度。黑客檢查所有密碼組合,包括所有字母、數字和特殊符號的組合,從可能的最小密碼長度開始。可能的組合數量取決於密碼的長度。理論上,這種破解方法的成功率是100%。這只是時間問題,因為短密碼可以在幾分鐘內猜出,而非常長且複雜的密碼可能需要數十年才能破解。

彩虹攻擊。大多數應用程序使用哈希對用戶密碼進行加密,並以加密形式存儲它們。黑客使用存儲預先計算的密碼哈希的彩虹表來破解數據庫中的密碼哈希。

網絡釣魚。通過網絡釣魚,攻擊者誘騙用戶單擊電子郵件附件或URL 鏈接,導致他們登錄到虛假版本的Web 應用程序並洩露他們的密碼。

反向蠻力。惡意行為者對多個用戶名使用通用密碼來訪問帳戶。

憑證填充。如果黑客知道被盜帳戶的用戶名和密碼,他們可以嘗試在該用戶可能擁有帳戶的多個系統中使用此組合。根據Security eMagazine的數據,53% 的人承認為不同的帳戶使用相同的密碼。

希望攻擊者無法破解您的Web 應用程序用戶的密碼不是一種選擇。因此,讓我們探討如何保護用戶數據免遭密碼破解並減輕帳戶洩露的網絡安全風險。

保護您的Web 應用程序免受密碼破解的7 種方法為了保護您的產品的用戶帳戶不被盜用,您需要實施一種綜合方法。下面,我們將討論緩解密碼破解的七種最必要的網絡安全實踐。

image.png

保護您的Web 應用程序免受密碼破解的7 種方法

1. 引入嚴格的密碼管理政策密碼越複雜,黑客破解它們的難度就越大。確保您的開發人員配置您的應用程序的密碼規則,以防止用戶創建弱憑據。

創建密碼規則列表時,請考慮研究頂級技術組織推薦和使用的內容。例如,您可以查看NIST 特別出版物800-63-3 數字身份指南中的密碼策略建議,並了解Microsoft 365和IBM Security Privileged Identity Manager等可靠產品推薦的密碼安全性。

密碼策略的常見最佳實踐包括:

马云惹不起马云密碼應包含特殊符號、數字以及小寫和大寫字母。

马云惹不起马云最小密碼長度應為八個符號。越長越好。

马云惹不起马云密碼應在指定時間段內過期和更改:每月一次、每三個月一次、每年兩次等。

马云惹不起马云您的應用程序應該有密碼歷史記錄,以便當用戶更改密碼時,它可以根據所有以前的密碼檢查新密碼。只有當它實際上是新密碼時,才應批准新密碼。

2.更改管理帳戶名稱避免使用“administrator”、“admin”或“root”等管理帳戶的明顯用戶名。此類用戶名很可能成為威脅行為者發起密碼破解攻擊時的第一個目標。

3.啟用多因素身份驗證使用多重身份驗證(MFA) 保護用戶對您的應用程序的訪問。此類身份驗證工具使用戶在登錄應用程序之前執行兩個或多個步驟。

第一步通常需要傳統的登錄名和密碼。在以下步驟中,可能會要求用戶輸入SMS 中的安全代碼、使用令牌、提供指紋等。

即使威脅者成功猜出憑據,MFA 也將成為訪問用戶帳戶的另一個障礙。

4.建立用戶活動監控考慮將用戶活動監控解決方案作為Web 應用程序安全性的一部分。此類解決方案會收集有關您的基礎架構內所有用戶活動的信息,因此如果發生可能是密碼破解攻擊跡象的異常用戶行為,您可以發現它。

用戶監控解決方案通常與人工智能驅動的訪問控制工具等複雜軟件一起使用,這些軟件可以分析收集的用戶活動數據、檢測異常情況,並阻止可疑的登錄嘗試或通知安全工程師潛在的威脅。

例如,此類解決方案可以保存設備詳細信息和用戶機器的IP 地址。如果有人嘗試從不同的IP 地址或設備登錄,訪問控制工具可以應用其他MFA 方法或限制訪問。

5. 將對服務器的遠程訪問限制為受信任的IP您的管理員和工程師帳戶也可能遭受密碼破解攻擊。因此,請確保僅對受信任的IP 地址啟用對服務器的遠程訪問。

例如,您可以提供對在日常工作中需要訪問服務器的工程師的IP 地址的訪問權限。為此,您可以使用防火牆(如果您使用雲提供商服務,則可以使用安全組)。

6.為工程師啟用安全密鑰需要遠程訪問服務器的工程師應該生成安全密鑰。例如,這些可能是用於SSH 訪問的SSH 密鑰。這樣,管理員可以安全地遠程連接到服務器或其他機器,而無需使用登錄名和密碼。 SSH 密鑰身份驗證可保護對服務器的訪問並加密客戶端和服務器之間傳輸的流量。

另一種無密碼訪問服務器的方法是使用硬件安全密鑰,如FIDO2或Google Titan。這些是可以用來代替常見身份驗證方法的USB 設備。

在這種情況下,應禁用使用登錄名和密碼訪問服務器。應僅允許密鑰持有者訪問。如果密碼不存在,則無法破解密碼。

7.使用密碼破解保護服務最後但並非最不重要的一點是,有一些特殊工具旨在保護服務免受密碼破解。

通常,此類工具會自動掃描登錄嘗試並阻止顯示惡意跡象的IP 地址,例如密碼失敗次數過多。這些工具中最受歡迎的是:

马云惹不起马云 SSH衛士

马云惹不起马云IPBan Pro

马云惹不起马云間諜日誌

马云惹不起马云Fail2ban

在Apriorit,我們更喜歡使用Fail2ban,因為它使用方便並且可以有效阻止潛在的惡意身份驗證嘗試。讓我們仔細看看Fail2ban 並討論如何在實踐中配置和使用它。

本文講述了保護您的Web 應用程序免受密碼破解的幾種方法,下文我們將介紹什麼是Fail2ban,以及它是如何工作的?

如何保護Web 應用程序免受密碼破解(上)

什麼是Fail2ban,它是如何工作的? Fail2ban是一種用於掃描日誌文件、檢測可疑活動(例如過多失敗的身份驗證嘗試)並阻止潛在惡意IP 地址的工具。

這項免費服務有助於保護Linux 機器免受暴力破解和其他自動攻擊。通常,Fail2ban 用於更新防火牆規則以在指定時間內拒絕IP 地址。

Fail2ban 具有以下優點:

易於設置

免費使用

可以與大量應用程序交互

提供大量配置參數

易於監控當前保護狀態

與各種通知服務集成

儘管Fail2ban 可以幫助您最大程度地減少不正確的身份驗證嘗試次數,並在一定程度上降低密碼破解和未經授權訪問的風險,但這並不是靈丹妙藥。

不利的一面是,Fail2ban 無法解決因服務器身份驗證策略薄弱而出現的問題。即使是最好的Fail2ban 配置也不能替代我們上面討論的密碼保護最佳實踐。此外,Fail2ban 僅適用於Linux,不適用於IPv6。

為了有效地保護您的服務,您還可以應用用於多因素和公共/私人身份驗證機制的工具。

image.png

Fail2ban 優缺點

Fail2ban 如何運作?以下是對其機制的簡單解釋:

任何應用程序或服務器總是將日誌保存在特定文件中,包括失敗的身份驗證嘗試的唯一日誌。

Fail2ban 掃描這些文件,搜索與身份驗證失敗相關的日誌。

如果檢測到失敗的身份驗證嘗試,Fail2ban 會保存嘗試時間和負責的IP 地址。

Fail2ban 計算在指定時間段內來自同一IP 的失敗身份驗證嘗試。

如果IP 地址超過允許的嘗試次數,Fail2ban 會創建一個新的防火牆規則來阻止此IP 地址。

結果,可疑的IP 地址將失去訪問服務器的能力。經過一段可配置的時間後,IP 地址可以自動解禁,也可以手動解禁。

例如,您可以配置Fail2ban,如果任何威脅行為者開始密碼破解攻擊,他們的IP 地址將被禁止五個小時。

現在,讓我們探索配置過程本身。

如何配置Fail2ban您可以配置Fail2ban 來讀取不同應用程序的日誌。開箱即用,此工具可以與以下應用程序類型交互:

SSH 服務器

HTTP 服務器

網絡郵件和群件服務器

網絡應用

HTTP 代理服務器

FTP服務器

郵件服務器

郵件服務器驗證器

DNS 服務器

來自不同類別的各種服務器應用程序

默認情況下,Fail2ban 啟用使用sshd的通信,這是一個OpenSSH 服務器進程。這意味著在多次SSH 身份驗證嘗試失敗後,負責的IP 地址將被禁止。

為了與任何應用程序交互,Fail2ban 使用Jail,它是一個過濾器和一個或多個操作的組合。此交互允許您在身份驗證嘗試失敗後禁止IP 地址。

默認情況下, Jail配置保存在jail.conf 文件中。如果要更改默認設置,請複製配置文件並將副本命名為jail.local。如果jail.local 文件存在,Fail2ban 將自動使用它而不是默認文件。

我們不建議更改原始配置文件,因為如果出現任何錯誤,返回默認設置將是一個挑戰。此外,一旦安裝了Fail2ban 的新更新,jail.conf 文件也將更新,所有自定義設置都將消失。

以下是Fail2ban 如何確定失敗的身份驗證嘗試:

該工具具有寫入jail.local 配置文件中的服務日誌文件的路徑。

失敗的身份驗證日誌和常規異常會自動添加到Fail2ban 文本過濾器中。

該工具使用文本過濾器掃描日誌文件。

如果您打開配置文件,您會發現一個相當大的Fail2ban 可以與之交互的應用程序列表。這些應用程序的名稱在括號中,如下面的示例代碼所示:

#Mailservers

[assp]

port=smtp,465,submission

logpath=/root/path/to/assp/logs/maillog.txt

[courier-smtp]

port=smtp,465,submission

logpath=%(syslog_mail)s

backend=%(syslog_backend)s

[postfix]

#Touseanothermodessetfilterparameter'mode'injail.local:

mode=more

port=smtp,465,submission

logpath=%(postfix_log)s

backend=%(postfix_backend)s

[postfix-rbl]

filter=postfix[mode=rbl]

port=smtp,465,submission

logpath=%(postfix_log)s

backend=%(postfix_backend)s

maxretry=1默認情況下,Fail2ban 被配置為僅使用SSH,所有其他通信協議都被禁用。如果需要開啟其他類型的通信,在配置文件中找到需要的類型,添加如下字符串:

enabled=true這是一個例子:

[nginx-http-auth]

enabled=true

port=http,https

logpath=%(nginx_error_log)s如果需要,您還可以更改與特定應用程序交互的現有參數或添加新參數。以下是常用參數列表:

ignoreip指定要被Fail2ban 忽略的IP 地址。默認情況下,此參數設置為忽略當前機器的流量。

bantime 以秒為單位設置禁令持續時間。默認值為600 秒。

findtime定義了監視來自每個IP 地址的失敗身份驗證嘗試的時間段。默認值為600 秒。

maxretry指定在findtime 指定的時間內每個地址的失敗登錄嘗試限制。

usedns確定是否使用反向DNS 進行阻止。如果設置為NO,那麼Fail2ban 將阻止IP 地址而不是主機名。如果設置為YES,該工具將嘗試使用反向DNS 來查找主機名並阻止它。默認值為WARN。它的工作方式與YES 值一樣,但也會記錄警告。系統工程師稍後可以查看所有警告。

協議指定將被阻止的流量類型。默認情況下它是TCP。

port指定要禁止的端口。

logpath顯示日誌文件的路徑。

注意:上面的列表並未描述所有Fail2ban 參數。您可以在配置文件中找到所有這些。

您可以在/etc/fail2ban 文件夾中的文件中的日誌路徑參數中找到默認設置的日誌文件路徑(例如,上面代碼示例中的nginx_error_log ) :

paths-common.conf — 具有默認服務日誌路徑的文件

paths-opensuse.conf、paths-arch.conf、paths-debian.conf — 包含不同Linux 系統特定路徑的文件

如果您打開上面提到的文件,您可以看到類似於這些的日誌文件的路徑:

apache_error_log=/var/log/apache2/*error.log

apache_access_log=/var/log/apache2/*access.log

auditd_log=/var/log/audit/audit.log

exim_main_log=/var/log/exim/mainlog

nginx_error_log=/var/log/nginx/*error.log

nginx_access_log=/var/log/nginx/*access.log如有必要,您可以編輯過濾器以指示應在日誌中搜索哪些文本以確定失敗的身份驗證。每個過濾器都位於/etc/fail2ban/filter.d 文件夾中的單獨文件中。

image.png

屏幕截圖1. /etc/fail2ban/filter.d文件夾中的過濾器列表

當您打開任何過濾器文件時,您將看到一個正則表達式,其中包含所需的失敗身份驗證文本,如下例所示:

image.png

屏幕截圖2. 驗證失敗的過濾文本

配置完成後,使用以下命令重新加載Fail2ban:

sudofail2ban-clientreload如果您只更改一個Jail文件的設置,則無需重新啟動該工具。只需使用此命令重新加載它:

image.png

此外,您可以將Fail2ban 配置為與配置文件中不存在的任何應用程序進行交互。您需要做的就是如上所述添加您的自定義配置。

如何使用Fail2ban要檢查當前啟用了哪些Jails ,請使用以下命令:

sudofail2ban-clientstatus以下是響應示例:

Status

|-Numberofjail:2

`-Jaillist:nginx-http-auth,sshd如您所見,服務器上啟用了nginx-http-auth 和sshd Jails 。如果你想檢查任何Jail參數的值,你不需要打開配置文件;只需使用以下命令:

image.png

下面的代碼示例向我們展示了sshd Jail maxretry 等於5:

sudofail2ban-clientgetsshdmaxretry5如果Jail超過其失敗身份驗證嘗試的限制,Fail2ban 將禁止在Jail配置中為IP 地址指定的端口。要檢查Jail狀態,請使用以下命令:

image.png

下面是一個響應示例,向我們展示了兩個IP 地址當前被禁止進行SSH 訪問:

Statusforthejail:sshd

|-Filter

||-Currentlyfailed:0

||-Totalfailed:25

|`-Filelist:/var/log/auth.log

`-Actions

|-Currentlybanned:2

|-Totalbanned:5

`-BannedIPlist:192.168.10.107192.168.10.115如果您嘗試在您的IP 在禁止列表中時訪問服務器,您會收到如下所示的“連接被拒絕”錯誤:

ssh:connecttohost192.168.10.105port22:Connectionrefused如果IP 地址被任何HTTP 服務器Jail禁止,錯誤將類似於:

curl:(7)Failedtoconnectto192.168.10.105port80:Connectionrefused您還可以使用以下命令手動將任何IP 地址添加到禁止列表:

image.png

這是一個例子:

sudofail2ban-clientsetnginx-http-authbanip10.100.1.210要手動取消禁止IP 地址,請使用以下命令:

image.png

這是一個例子:

sudofail2ban-clientsetnginx-http-authunbanip10.100.1.210考慮到這一點,讓我們開始在Fail2ban 中配置通知。

如何配置Viber 聊天機器人以接收Fail2ban 通知如果要監控Fail2ban 活動,請使用以下三個步驟配置實時活動通知:

配置您要使用的任何通知服務

準備Fail2ban 動作配置文件

更新jail.local 文件中的action參數值

Fail2ban 具有使用電子郵件服務的配置。您需要做的就是在服務器上配置服務。

但是,如果您想通過Viber 等消息服務獲取通知怎麼辦?讓我們討論如何配置它!

首先,要將Viber 用作通知服務,您需要創建一個Viber 聊天機器人。您可以在Viber API 文檔頁面上找到有關Viber 聊天機器人設置和配置的文檔。

一旦您的聊天機器人準備就緒,請務必執行以下步驟:

1. 獲取Viber 聊天機器人的身份驗證令牌。您可以在Viber 管理面板頁面上找到它。

2.在訂閱Viber 聊天機器人的所有用戶列表中找到您的用戶ID。為此,請使用以下HTTP 請求:

image.png

響應將向您顯示成員列表,如下例所示:

image.png

選擇所需成員的ID 並複制。

現在,您可以開始配置Fail2ban。轉到/etc/fail2ban/action.d 文件夾,其中包含所有可能的Fail2ban 操作的配置。

為Viber 通知創建一個新的配置文件。我們將其命名為viber_notifications.conf。現在將以下內容添加到文件中:

image.png

讓我們弄清楚上面的字符串是什麼意思以及我們可以配置什麼:

actionban和actionunban參數描述了Fail2ban禁止或取消禁止可疑IP 地址時需要執行的操作。在我們的例子中,HTTP 請求會將消息從您的Viber 聊天機器人發送給您指定的用戶。

image.png

sender為配置通知發送者名稱的參數。在我們的示例中,我們使用名稱“Fail2ban”。

type是幫助您配置消息類型的參數。您可以使用Viber 發送不同的消息類型。在我們的示例中,我們使用文本類型。

image.png

name=default是一個字符串,表示將動態分配Jail名稱

我們的下一步是配置jail.local。為此,您需要在必要的Jail部分添加一個操作參數或更新[DEFAULT]部分中的默認參數。該參數應包含兩個操作:第一個用於IP 禁止,第二個用於Viber 通知。

這是使用action參數的示例

action=%(action_)s

viber_notifications注意:%(action_)s是默認操作值。此操作將禁止IP 地址。讓我們將Viber 操作配置名稱“viber_notifications”添加到第二個字符串。

現在,由於對jail.conf 文件進行了更改,您需要重新加載Fail2ban 客戶端並重新啟動服務:

sudofail2ban-clientreload

systemctlrestartfail2ban聊天機器人將如下所示:

screenshot-3-Fail2ban-notifications-in-a-viber-chatbot.jpg

屏幕截圖3. Viber 聊天機器人中的Fail2ban 通知

配置完成。現在您可以使用Viber 聊天機器人實時監控Fail2ban 活動!

結論密碼破解攻擊是對任何應用程序的嚴重威脅。惡意行為者使用不同的方法來未經授權訪問用戶帳戶並竊取用戶的敏感數據。

為了保護您的應用程序免受此類威脅,請應用嚴格的身份驗證策略並使用Fail2ban 等服務設置可靠的密碼破解保護。

惡意行為者通常以用戶和管理員憑據為目標,因為他們希望使用它們來訪問敏感數據。據Verizon 稱,在2021 年受到社會工程攻擊的數據中,憑證佔高達85%。為了竊取用戶憑證,黑客可以使用惡意軟件或各種密碼破解方法。

薄弱的密碼策略和缺乏防止密碼破解的保護是導致帳戶洩露的兩個最常見的漏洞。

在本文中,我們討論了密碼破解的危險並提供了減少惡意身份驗證嘗試的最佳實踐。我們還探討了Fail2ban 服務如何幫助您保護對用戶帳戶的訪問,並提供有關如何配置Fail2ban 的分步指南,以及分享我們在Viber 聊天機器人中配置Fail2ban 通知的經驗。

本文將幫助Web 產品所有者和軟件開發團隊識別並消除其Linux 服務器的漏洞。

什麼是密碼破解?要訪問Web 應用程序,用戶需要在系統內創建配置文件。為此,用戶通常會創建一個登錄名和密碼作為用於保護帳戶訪問的憑據。根據申請類型,他們可能還必須提供其他數據,如個人信息、消息和銀行賬戶。所有這些數據對威脅行為者都很有價值,他們可以嘗試使用各種密碼竊取方法從不同的應用程序訪問用戶配置文件。

在開發Web 應用程序時,必須牢記密碼被盜的風險並實施強大的安全機制來減輕這些風險。否則,如果攻擊者設法訪問用戶帳戶並暴露個人信息,Web 應用程序提供商可能會面臨客戶流失和聲譽受損等後果。如果用戶決定將案件告上法庭,他們也可能承擔經濟損失。

image.png

密碼破解的後果

竊取用戶數據的一種方法是破解密碼。

這種方法的主要目標是猜測應用程序或計算機服務的密碼。該技術本身不一定是惡意的,它可以作為一種目標漏洞驗證技術用於安全測試。

密碼破解是從存儲在計算機系統中或通過網絡傳輸的密碼哈希中恢復密碼的過程。它通常在評估期間執行,以識別密碼較弱的帳戶。

在應用密碼破解技術時,黑客通常會使用特殊的應用程序和工具,這些應用程序和工具會應用多個憑據變體,直到找到正確的一對。密碼破解應用程序用於猜測密碼的每秒憑據數取決於攻擊者計算機的性能。此外,猜測用戶密碼所需的時間取決於密碼強度。

密碼破解方法有多種:image.png

密碼破解攻擊的類型

字典攻擊是一種通過系統地輸入字典中的每個單詞作為密碼來訪問IT 資源的方法。黑客經常使用破解詞典,其中存儲了常用的密碼和熟悉的單詞,例如不同語言的名稱和地點。此類詞典還可能包括黑客收集和添加的先前被盜的用戶憑證。字典攻擊是一種快速猜測弱口令的方法,但對於不常見的強口令,它們通常不會成功。

蠻力攻擊是一種直接的試錯法,它著重於生成所有可能的密碼,達到一定長度。黑客檢查所有密碼組合,包括所有字母、數字和特殊符號的組合,從可能的最小密碼長度開始。可能組合的數量取決於密碼的長度。理論上,這種破解方法的成功率是100%。這只是時間問題,因為短密碼可以在幾分鐘內猜出,而非常長且複雜的密碼可能需要數十年才能破解。

彩虹襲擊。大多數應用程序使用哈希加密用戶密碼,並以加密形式存儲它們。黑客使用存儲預先計算的密碼哈希值的彩虹表來破解數據庫中的密碼哈希值。

網絡釣魚。通過網絡釣魚,攻擊者誘使用戶單擊電子郵件附件或URL 鏈接,引導他們登錄到虛假版本的Web 應用程序並洩露他們的密碼。

反向蠻力。惡意行為者使用針對多個用戶名的通用密碼來訪問帳戶。

憑據填充。如果黑客知道受感染帳戶的用戶名和密碼,他們可以嘗試在該用戶可能擁有帳戶的多個系統中使用此組合。據Security eMagazine報導,53% 的人承認對不同的帳戶使用相同的密碼。

希望攻擊者無法破解您的Web 應用程序用戶的密碼不是一種選擇。因此,讓我們探討如何保護用戶數據免遭密碼破解,並減輕帳戶洩露帶來的網絡安全風險。

保護Web 應用程序免遭密碼破解的7 種方法為保護您產品的用戶帳戶不被洩露,您需要實施綜合方法。下面,我們將討論緩解密碼破解的七種最必要的網絡安全實踐。

image.png

保護Web 應用程序免遭密碼破解的7 種方法

1. 出台嚴格的密碼管理政策密碼越複雜,黑客破解它們的難度就越大。確保您的開發人員配置您的應用程序的密碼規則,以防止用戶創建弱憑據。

創建密碼規則列表時,請考慮研究頂級技術組織推薦和使用的內容。例如,您可以查看NIST 特別出版物800-63-3 數字身份指南中的密碼策略建議,並了解Microsoft 365和IBM Security Privileged Identity Manager等可靠產品推薦的密碼安全性。

密碼策略的常見最佳做法包括:

密碼應包含特殊符號、數字以及大小寫字母。

最小密碼長度應為八個符號。越長越好。

密碼應在指定的時間段內到期並更改:每月一次、每三個月一次、每年兩次等。

您的應用程序應具有密碼歷史記錄,以便當用戶更改密碼時,它可以根據所有以前的密碼檢查新密碼。只有當新密碼實際上是新的時,才應批准新密碼。

2.更改管理帳戶名稱避免使用明顯的管理帳戶用戶名,例如“administrator”、“admin”或“root”。此類用戶名很可能成為威脅行為者發起密碼破解攻擊的首要目標。

3.啟用多重身份驗證使用多重身份驗證(MFA) 保護用戶對您的應用程序的訪問。此類身份驗證工具使用戶在登錄應用程序之前執行兩個或更多步驟。

第一步通常需要傳統的登錄名和密碼。在以下步驟中,可能會要求用戶從短信中輸入安全代碼、使用令牌、提供指紋等。

即使威脅行為者成功猜出憑據,MFA 也將成為訪問用戶帳戶的另一個障礙。

4.建立用戶活動監控考慮將用戶活動監控解決方案作為Web 應用程序安全性的一部分。此類解決方案收集有關您基礎設施內所有用戶活動的信息,因此如果出現可能是密碼破解攻擊跡象的異常用戶行為,您可以發現它。

用戶監控解決方案通常與人工智能驅動的訪問控制工具等複雜軟件一起使用,這些軟件可以分析收集到的用戶活動數據、檢測異常情況,並阻止可疑的登錄嘗試或通知安全工程師潛在威脅。

例如,此類解決方案可以保存設備詳細信息和用戶機器的IP 地址。如果有人試圖從不同的IP 地址或設備登錄,訪問控制工具可以應用其他MFA 方法或限制訪問。

5. 將對服務器的遠程訪問限制為受信任的IP您的管理員和工程師帳戶也可能遭受密碼破解攻擊。因此,請確保僅為受信任的IP 地址啟用對服務器的遠程訪問。

例如,您可以為需要在日常工作中訪問服務器的工程師提供IP 地址的訪問權限。為此,您可以使用防火牆(如果您使用雲提供商服務,則可以使用安全組)。

6.為工程師啟用安全密鑰需要遠程訪問服務器的工程師應該生成安全密鑰。例如,這些可以是用於SSH 訪問的SSH 密鑰。這樣,管理員可以安全地遠程連接到服務器或其他機器,而無需使用登錄名和密碼。 SSH 密鑰身份驗證可保護對服務器的訪問並加密客戶端和服務器之間傳輸的流量。

另一種無密碼訪問服務器的方法是使用硬件安全密鑰,如FIDO2或Google Titan。這些是可以用來代替常見身份驗證方法的USB 設備。

在這種情況下,應禁用使用登錄名和密碼訪問服務器。應該只允許鑰匙持有者進入。如果密碼不存在,則無法破解。

7.使用密碼破解保護服務最後但並非最不重要的一點是,有一些專門用於保護服務免遭密碼破解的工具。

通常,此類工具會自動掃描登錄嘗試並阻止顯示惡意跡象的IP 地址,例如密碼失敗次數過多。這些工具中最受歡迎的是:

SSH衛士

IPBan Pro

間諜日誌

Fail2ban

在Apriorit,我們更喜歡使用Fail2ban,因為它使用起來很方便,並且可以有效地阻止潛在的惡意身份驗證嘗試。在下一章中,讓我們了解Fail2ban,並討論如何在實踐中配置和使用它。

微控制器對網絡安全威脅和攻擊的保護有限。因此,物聯網(IoT) 設備和依賴它們的嵌入式系統的安全性可能會受到損害。

為了提高物聯網設備或其固件的安全性,您需要確切地知道使用了哪些微控制器。掌握這些知識為更深入的軟件分析開闢了新的可能性,從而更有效地改進解決方案的性能和安全性。在本文中,我們展示了一種使用固件分析來識別微控制器型號的方法。

本文將對尋求自動執行微控制器識別過程的有效方法的嵌入式軟件開發人員和逆向工程專家有所幫助。

什麼是微控制器以及如何識別微控制器如今,人們每天使用各種嵌入式系統和物聯網設備,其中裝有各種微控制器。微控制器或微控制器單元(MCU) 是設計用於在嵌入式系統中執行特定操作的小型集成電路。

工程師經常在醫療物聯網設備、汽車系統,甚至航天工業中使用MCU。無論一個設備是測量你的心率、檢測空氣中的煙霧,還是管理你的智能汽車的能源消耗,都會有一整套微控制器參與到這個過程中。

一個基本的微控制器通常由三個核心組件組成:

處理器

記憶

輸入/輸出(I/O) 外設

微控制器通常具有有限的內存和帶寬資源,並且專用於特定任務。大多數微控制器都是定制的,沒有前端操作系統。

由於資源有限,微控制器很容易成為網絡犯罪分子的目標。這就是為什麼要確保IoT 設備得到適當的保護,解決設備所依賴的微控制器的特定漏洞和弱點至關重要。

當您擁有從頭開始構建的自定義設備時,您可能會了解它的所有來龍去脈。但是,如果您的項目記錄不完整,或者您必須使用您一無所知的物聯網設備,那麼首要任務是確定其使用的微控制器型號。

如何識別單片機型號?試圖將不同的二進製文件彼此區分開來可能具有挑戰性,尤其是當二進製文件使用大量相似的代碼或執行相似的功能時。在識別與微控制器相關的二進製文件時,您很容易遇到執行類似任務的函數,這會使事情變得比可執行二進製文件更加模糊。

然而,有一種有效的方法不僅可以識別微控制器的型號,還可以使過程自動化。

首先,讓我們看一下識別MCU型號需要採取的關鍵步驟:

image.png

要自動化此過程並能夠快速輕鬆地識別微控制器模型,您需要:

自動生成C 風格的偽代碼。您可以使用IDA-Pro 或Ghidra 等工具執行此操作。

從微控制器的代碼或數據庫中收集要搜索的微控制器的所有標頭。

現在讓我們看看如何使用這種方法識別未知的微控制器。

根據硬件地址識別MCU型號在本節中,我們將討論如何通過分析其外圍設備的硬件地址來識別微控制器的型號。

由於外圍設備使用硬件訪問,你應該可以在單片機的二進制代碼中看到對靜態硬件地址的訪問,而這些地址應該定義在一個C頭文件中。此外,由於這些地址是硬編碼的,因此它們不應受到二進制地址空間佈局隨機化(ASLR)的嚴重影響。

要遵循我們的指南,您需要了解C、Python和以下工具:

命令

IDA專業版

GNU 編譯器集合(GCC)

py-c-預處理器

我們將使用NXP的S32 PPC 微控制器,特別是MPC5 定時器演示。但是,請記住,下面描述的方法可以應用於您遇到的任何MCU。這種方法唯一可能效率低下的情況是,如果有一個與您的MCU 模型非常相似的微控制器;例如,如果兩個或多個MCU 型號由同一家公司製造並且具有相同的外圍設備。

現在讓我們開始吧。

1.分析單片機源碼使用MPC5 微控制器演示並在IDA-Pro 中查看其源代碼。您應該會以類似結構的模式看到一些對外圍設備的引用。當您深入研究時,您將看到對MPC5744P.h標頭的引用以及此類定義:

image.png

這些是對微控制器外圍設備的硬編碼引用。

你注意到它們是結構了嗎?這意味著由於填充和對齊,它們在內存中看起來會略有不同。

這些結構地址將是您的關鍵信息來源,因此您需要通過解析來獲取所有這些地址,而無需花費太多時間和精力。

2. 解析和排序來自標題的信息由於手動查找和復制硬件地址是一項繁瑣且耗時的任務,您可以嘗試將此過程自動化。

由於結構地址是定義,您可以使用GCC 通過以下命令解析它們:

image.png

在哪裡

image.png

包含微控制器頭文件的路徑。

執行此命令允許轉儲所有#definitions預處理器值。然後,您可以通過使用grep 實用程序處理目標結構來過濾接收到的信息。

一旦獲得GCC 的輸出,就可以使用正則表達式(regex)來過濾定義名稱和地址。在我們的示例中,我們將使用RE Python 模塊在Python 中使用正則表達式。

我們選擇使用Python 工具,因為Python 易於閱讀且易於學習。也不需要學習內存管理,相比其他一些語言,我們可以簡單方便地完成我們的任務。

以下是如何在Python 中使用正則表達式過濾數據:

image.png

注意:如果你遇到一些需要評估定義的場景

image.png

你將需要一個預處理器。預處理器將獲取#definitions值並在預編譯時解析出這些值,因此您不必通過多個標頭手動搜索它們。

以下是使用Python 的py-c-preprocessor執行此操作的方法:

image.png

現在,讓我們回到我們的分析。

3.將二進制轉儲為C風格的偽代碼如果您的硬件地址排序正確,您應該看到每個新外圍設備的地址從哪裡開始,從而能夠在二進製文件中找到外圍結構。

但是,嘗試在十六進制編輯器中解析二進製文件可能很困難。相反,您可以打開二進製文件並在IDA Pro 中對其進行分析。

在IDA Pro 中打開二進製文件後,您可以通過單擊file → produce file → C file生成帶有C 風格偽代碼的文件。帶有C 風格偽代碼的文件將保存微控制器模型識別所需的地址。

4.在偽代碼中搜索外設地址一旦有了C 文件,就可以開始搜索外圍設備地址了。如果您查看帶有C 風格偽代碼的文件,您會看到多行地址。

image.png

請注意,由於所存儲信息的大小,這些地址在偽代碼中略有偏差。

您應該能夠簡單地加載頭文件,解析和排序定義,然後使用C 風格的偽代碼在文件中搜索它們。和上一步一樣,可以使用regex解析C文件,使用parse_memory_locations_from_C_file函數過濾出自己需要的地址:

image.png

然後你需要將你從頭文件中拉取的排序後的地址和在C 風格的偽代碼文件中找到的地址傳遞給perform_search函數。

image.png

注意:從技術上講,如果您知道結構的大小,則可以在確切位置自動找到所有具有相同大小的結構。但是,我們不會描述這個過程,因為它超出了當前指南的範圍。

5.識別單片機型號使用C 風格偽代碼在文件中搜索外設地址後,您可以嘗試識別您的微控制器。為此,將二進製文件標頭中的硬件地址與C 文件中的地址進行比較。通過計算不同微控制器的加權分數,您將能夠識別您正在處理的那個。

以下是我們示例的結果:

image.png

加權得分最高的微控制器就是您要找的那個。在我們的例子中,它是MPC5744P.h 微控制器。

要查看我們指南中使用的腳本的完整代碼,請轉到Apriorit GitHub頁面。

結論微控制器是當今物聯網設備的重要組成部分。了解特定設備包含哪些微控制器對於有效提高設備的性能和安全性是必要的。

測試軟件的性能可能非常耗時。不斷檢查和修復失敗的測試或錯誤會花費大量時間,並且需要質量保證(QA) 團隊付出大量努力,尤其是當他們手動進行時。

為了節省時間並仍然提供高質量的結果,許多項目旨在自動化他們的測試工作。我們謹慎地開發自動化測試策略並使用TestRail 來管理自動化測試結果。

本文將通過分享我們在使用此工具時的策略,幫助您了解如何借助TestRail 提高QA 流程的效率。

為什麼要管理自動化測試結果?為確保有效的自動化測試,您需要製定測試管理策略並為您的項目選擇合適的技術和測試覆蓋率。這將為您提供自動測試結果的透明度、對這些結果的有效分析和管理,以及處理脆弱測試的策略,這些測試在大多數時間都有效。

實施測試自動化時最常見的問題之一是缺乏對自動測試結果管理的關注。管理自動化測試的結果是構建高效測試策略不可或缺的一部分。從長遠來看,它可以幫助您顯著縮短重複的手動測試過程並優化您的QA 費用。

最壞的情況是當您在自動質量保證(AQA) 環境中本地運行測試並且它們沒有集成到持續集成和持續部署(CI/CD) 管道中時。在這種情況下,您無法控制自動測試的定期運行或其結果。隨著時間的推移,或者在更改AQA 環境之後,自動測試可能永遠不會再次運行,並且它們之前的結果可能會丟失。因此,專門用於編寫和運行這些測試的資金和其他資源可能被證明是白費了。

在更成熟的流程中,QA 工程師和開發人員將自動測試集成到CI/CD 管道中。 QA 專家定期在測試環境中運行測試,並將結果匯總在一份報告中。通常,自動化測試團隊獨立於手動測試團隊工作。因此,手動測試及其結果與自動測試分開監控。這有一些負面影響:

您需要在多個地方努力管理測試結果

存在不及時響應失敗的自動測試的風險

有時,人工和自動化QA 專家對監控自動測試結果的職責模糊不清,這可能導致測試結果未被處理甚至丟失。此外,手動和自動QA 專家的職責不明確使計算自動測試覆蓋率的過程變得複雜,而自動測試覆蓋率是管理測試自動化的最重要指標之一。

現在,讓我們看看可以將測試自動化工具集成到測試過程中的不同情況。

您可以使用測試自動化工具實現什麼?通過將自動測試管理工具集成到QA 部門的工作中,您可以監督很多事情。

image.png

您可以使用自動測試自動化工具做什麼

自動化測試場景。自動測試管理工具為您提供了一種存儲自動測試場景以供將來使用的便捷方式。例如,如果您使用行為驅動開發或基於關鍵字的測試自動化方法,您可以為每次測試運行從存儲中檢索自動化測試場景。

測試執行過程。在測試用例的執行過程中,自動測試管理工具提供了許多組合測試的選項:順序執行、優先級排序、並行執行等。根據測試項目的要求、資源和目標,您可以選擇最佳選項並將其集成到您的自動測試管理工具中。

測試執行結果。許多測試管理工具允許您在測試運行後生成報告。這些報告有很多可視化組件,包括執行結果、失敗的測試和失敗的原因,以及總執行時間。

測試執行歷史。您所有的測試運行結果都已存儲並可以隨時檢索。您還可以根據所選工具的功能使用不同參數生成所有執行的統計信息。

為了優化自動測試結果的監控和管理,Apriorit 團隊採用了一種綜合方法,結合了手動和自動測試活動。作為這種方法的一部分,我們:

確保負責手動和自動測試工作的QA 專家作為單個團隊的一部分不斷聯繫

使用單一工具管理手動測試和自動測試

有幾種流行的自動測試結果管理工具,包括TestRail、Zephyr、QMetry 和Testmo。根據我們的經驗,我們更喜歡使用TestRail,因為它具有以下優勢:

image.png

TestRail的優勢

Jira 測試集成。我們使用Jira 作為我們的主要進度跟踪軟件,因此將TestRail 與Jira 一起用於測試自動化對我們團隊來說非常方便。

能夠管理手動和自動測試。這提高了我們QA 團隊的工作效率,使他們能夠及時響應失敗的測試。

測試用例統一。這使我們能夠以一種適合我們的單一格式使用測試用例,並以相同的格式自動從TestRail 導出測試用例。在我們導入現有的測試用例或創建新的測試用例後,TestRail 會將選定的模板應用於所有可用的測試用例。

用戶友好的用戶界面。 TestRail 不僅在視覺上很吸引人,而且使用起來也很直觀。

現在讓我們來看看我們在TestRail 中管理自動化測試結果的策略。

如何在TestRail中處理自動化測試結果我們基於左移方法開發了自己有效的QA 策略。

該策略的好處包括:

質量保證活動的時間和成本節省

更快的上市時間

改善用戶體驗

令人滿意的產品性能

作為我們有效的自動化策略的一部分,我們在策略實施之前的早期測試階段建立了自動測試覆蓋率。完成測試設計階段後,我們分析哪些設計的測試用例應該被自動測試覆蓋。所選測試在TestRail 中的類型字段中標記為自動。

指定測試用例類型可以讓我們在TestRail自動化測試時,所有的自動測試都有對應的測試用例。通過這種方法,運行自動測試和監控其結果的過程變得可控和透明。由於我們為每個自動測試都有一個相應的測試用例,並且我們知道如何在TestRail 中自動創建測試運行,因此我們可以按如下方式最終確定我們的自動測試結果管理策略:

image.png

Apriorit 自動測試結果管理策略

首先,我們為每個構建運行自動測試作為CI/CD 管道的一部分。

成功構建後,我們將新的自動測試版本發送到單獨的測試台以運行自動測試。

每次運行時,我們都會在TestRail 中形成一個新的測試運行,添加所有自動化類型的測試。

形成一個新的試運行後,我們按照一個模板來命名,這樣我們就可以很方便的了解試運行的版本和時間。例如,我們使用以下模板:Acceptance_Automation_Run_

完成自動測試後,每個測試的狀態都會在測試運行中自動輸入- 通過、失敗或未測試。

我們完成所有測試運行。之後,我們會收到一條通知,其中包含指向新測試運行的鏈接。

最後,我們審查通過測試的結果並分析狀態為“失敗”或“未測試”的測試。

在處理狀態為“失敗”或“未測試”的測試時,我們還使用定義的工作流程:

我們為回溯系統中所有失敗的測試創建錯誤票。我們的團隊總是重新檢查失敗的測試,並在錯誤報告中包含有關手動檢查結果的信息。

我們始終將修復錯誤或失敗的測試放在首位,即使它無法手動重現。我們這樣做是因為對我們來說,不正確的工作或失敗的測試與成品中的錯誤具有相同的優先級。

我們還為狀態為Untested 的測試創建錯誤票。一旦我們在測試運行中包含了自動類型的測試,它們就必須被覆蓋並且應該定期執行。如果有測試但我們團隊還沒有執行,這也是與產品bug同等優先級的問題。

因此,我們創建了一個透明的系統來監視和控制自動測試啟動的規律性和自動測試的結果。整個團隊,從AQA 和手動QA 專家一直到開發人員和管理人員,都可以收到有關測試啟動的通知並輕鬆查看測試運行的結果。

AQA 和手動QA 專家都可以查看測試結果和在失敗測試中註冊的錯誤。一切都是完全透明的,測試過程的所有參與者都可以訪問。現在我們已經解釋了我們在TestRail 中處理自動化測試結果的策略,是時候將TestRail 自動化集成到您的QA 流程中了。

如何將自動測試結果與TestRail 集成(實例)如果您想將自動測試結果與TestRail 集成,您可以使用與您在編寫自動測試時使用的技術相對應的現成插件。我們在下面的示例中展示的方法適用於Python 測試和Cypress 測試。

我們建議在每次運行自動測試時創建一個新的測試運行,因為它比運行單個測試更方便。這樣,您就不會丟失任何重要信息,例如測試執行日期和失敗測試統計信息。為了在每次運行自動測試時創建一個新的測試運行,我們在TestRailAPI 上實現了一個包裝器。

讓我們仔細看看每個使用的插件。

集成Python 測試您可以使用pytest-testrail插件將TestRail 和自動化測試集成到您的QA 流程中。

當您運行Python 自動測試時,您需要指定報告者和測試運行ID。

例如:

python-mpytest--testrail--tr-run-id=111自動測試標記為@pytestrail.case(*testrail_case_id*)。執行測試後,相應的測試狀態將添加到測試運行中。

在測試運行執行期間,我們使用來自testrail.cfg 文件的數據,其中包含以下參數:URL、憑據、project_id、suite_id 等。

以下是Python 測試的配置文件的樣子:

Python

[API]

url=https://yoururl.testrail.net/

email=user@email.com

password=

[TESTRUN]

assignedto_id=1

project_id=2

suite_id=3

plan_id=4

description='Thisisanexampledescription'

[TESTCASE]

custom_comment='Thisisacustomcomment'現在讓我們看一下將Cypress 測試集成到TestRail 中。

您可以使用TestRail Reporter for Cypress將Cypress 測試集成到TestRail 中。

您需要在TestRail Cypress 測試中包含測試用例的ID。在執行Cypress 測試時,您可以自動從cypress.json 文件中獲取數據。此數據包括以下參數:reporter、testrail URL、credentials、project_id、suite_id、run_id 等。

例如:

JavaScript

.

'reporter':'cypress-testrail-milestone-reporter',

'reporterOptions':{

'domain':'yourdomain.testrail.com',

'username':'username',

'password':'password',

'projectId':'projectIdNumber',

'milestoneId':'milestoneIdNumber',

'suiteId':'suiteIdNumber',

'createTestRun':'createTestRunFlag',

'runName':'testRunName',

'runId':'testRunIdNumber',

}為方便起見,您可以在每次測試運行結束時自行生成包含關鍵指標的報告。接下來,我們關注這些指標及其含義。

如何理解TestRail 中的重要指標將TestRail 用於您的QA 流程,除了提供自動測試的透明度和可控性之外,還可以輕鬆收集重要指標並跟踪其動態。執行測試運行後,您可以隨時在TestRail 中查看有關測試的結果和重要信息。

我們建議在報告中關注兩個重要指標:

image.png

主要的TestRail 指標

1. 自動化覆蓋率是自動測試覆蓋的測試用例的百分比。當您使用TestRail 管理自動化測試用例時,它們都有一個單獨的類型。您可以輕鬆計算驗收測試覆蓋率百分比以及整體自動化覆蓋率。

要了解自動測試的數量和百分比,請轉到“報告”選項卡。選擇名稱並為您的報告添加描述。之後,選擇Report Options中的Grouping選項卡並按Type對測試用例進行分組。

Property-Distribution-report-1.png

截圖1. Property Distribution 報告

最好定期生成Property Distribution 報告以監控指標動態,這將使您的團隊能夠控制自動測試覆蓋範圍的增加或縮小。

2. 每個測試的成功率是特定測試的通過/失敗狀態的百分比。在TestRail 報告的幫助下,您可以跟踪特定測試失敗的次數,並關注最常失敗的測試。

要在TestRail 中分析失敗的測試,首先轉到Reports選項卡。輸入名稱並為您的報告添加描述。之後,在Report Options 中選擇Failed狀態。

image.png

屏幕截圖2. Status Tops 報告

完成這些操作後,您將看到最常失敗的測試。

在分析失敗的測試時,您可以將它們分為兩類:

片狀測試(不可靠、脆弱的測試)——不穩定且經常失敗的測試,沒有明顯原因給出誤報結果,而不是發現實際錯誤。我們將在下一節中詳細描述使用此類測試的策略。

不穩定的測試或用例——損壞或有問題的測試或用例。這些測試表明您的模塊中有脆弱的代碼,您的QA 團隊可能需要重構它。

您需要立即解決並嘗試修復任何無緣無故失敗的測試,以免它拖延開發過程並在未來佔用您的QA 專家的時間。讓我們仔細看看如何處理這些不穩定的測試。

如何管理不穩定的測試不穩定的測試需要QA 專家的特別關注,他們處理自動測試、分析每個測試運行的結果,並為每個失敗的測試發布錯誤報告。不穩定的測試可能需要QA 專家付出大量努力,包括每次測試運行所花費的時間和資源、失敗測試的手動分析以及修復測試所花費的時間。

為了減少花在不可靠測試上的時間,您需要在自動測試管理策略中明確描述使用此類測試的策略。在Apriorit,我們有一個處理不穩定測試的清晰策略:

image.png

如何管理片狀測試

步驟1.首先,我們在這種特殊情況下定義了一個不穩定的測試。在我們的實踐中,如果某項測試連續三次出現誤報,我們就會認為該測試不穩定或不可靠。

第2 步。我們嘗試通過修復它來穩定flaky 測試。

第3 步。如果在嘗試修復它後,測試仍然失敗並給出誤報結果,我們可能需要刪除自動測試並更改TestRail 中的測試用例類型。

如果測試不可靠並且您無法穩定它,它就會成為您的QA 團隊的負擔。當測試不可靠並且您不能相信其結果時,最好盡快修復它或將其刪除。這樣,您就不必花時間支持和監控易碎測試的結果並手動檢查它們。

現在您有了處理不可靠測試的明確計劃。因此,您可以確信您的QA 團隊不會在此類測試上浪費太多時間和精力。

結論您可以將我們的示例作為QA 流程的基礎,並根據您的需要進行調整。使用TestRail 進行自動化測試結果管理可讓您顯著改善質量保證工作。在TestRail 的幫助下,您的QA 團隊可以減少在測試運行上花費的時間和資源。您還可以在TestRail 中跟踪您的結果,從而更有效地管理您的測試運行並處理失敗的測試和錯誤。

監控和限制對潛在惡意文件的訪問可以使您的產品免遭黑客攻擊、數據洩露和破壞。為了在基於Linux的環境中做到這一點,開發人員通常必須進行內核級修改,這實現起來很複雜,並且對系統來說存在風險。

在本文中,我們探討了內核級修改的替代方案:安全增強型Linux (SELinux) 中的自定義策略和沙箱。我們研究如何使用它們進行事件記錄和監視、限製文件訪問以及控制自定義沙箱內的系統調用。

為什麼要限制Linux 環境中的文件訪問?在創建軟件解決方案時(無論是簡單的驅動程序還是複雜的網絡安全系統),保護您的產品免遭未經授權的訪問非常重要。對於開發基於Linux 的產品的團隊來說,監視和管理數據和文件訪問的常見原因包括:

image.png

有幾種傳統方法可以做到這一點:創建Linux 內核模塊來掛鉤文件操作、設置掛鉤來監視和控制進程等。傳統的限制訪問方法通常需要高級技術專業知識,並且會給開發過程帶來額外的複雜性。它們還可能向您的環境添加嚴重錯誤,因為它們通常需要內核級更改。這就是為什麼只有當您需要對文件的訪問權限進行細緻的控制時,此類方法才有用。

當您只需要監視、允許或拒絕訪問而不需要任何其他更改時,最好使用SELinux。該系統集成到Linux 內核中,為開發人員提供強制訪問控制的方法。 SELinux 為Linux 環境中的元素設置上下文並通過策略對其進行管理。 SELinux 提供了一個強大的沙箱,允許您在有限的環境中執行進程。此環境利用SELinux 策略來定義沙箱中運行的進程的約束和權限。使用此類策略可以讓開發人員有效地增強其應用程序的安全狀況。

使用SELinux 管理文件訪問有幾個優點:

马云惹不起马云 簡單的政策管理。 SELinux 的策略文件是人類可讀的,因此無需學習特定語法來編寫策略。

马云惹不起马云精細的訪問控制。您可以在策略中指定任何訪問限制和權限。

马云惹不起马云可靠的文件隔離。為了控制對文件的訪問,SELinux 將其放入沙箱中,將文件與環境的其餘部分隔離。

马云惹不起马云簡化訪問管理。更改策略中的訪問權限比實施和進行內核級修改要容易得多。

在詳細探索如何使用SELinux 之前,請確保有一個適合創建SELinux 策略的環境。請注意,在本示例中,我們使用Fedora Workstation 和Red Hat Enterprise Linux 發行版。默認情況下,這些系統上啟用了SELinux,但最好在繼續我們的指南之前仔細檢查您的系統是否啟用了SELinux。

設置SELinux環境在將SELinux 策略應用於生產系統之前,請確保在測試或開發環境中執行此處描述的步驟。錯誤配置的策略可能會影響系統功能和安全性。

如果您的Linux 發行版不包含SELinux,您可以通過打開終端並以root 用戶身份執行以下命令來啟用它:

$sudodnfinstallselinux-policy-targeted安裝完成後,重新啟動系統。重新啟動後,SELinux 將啟用並在強制模式下運行。要確認其安裝成功,請打開終端並執行以下命令:

$sestatus

SELinuxstatus:enabled

SELinuxfsmount:/sys/fs/selinux

SELinuxrootdirectory:/etc/selinux

Loadedpolicyname:targeted

Currentmode:enforcingThislinedescribescurrentmode

Modefromconfigfile:enforcing

PolicyMLSstatus:enabled

Policydeny_unknownstatus:allowed

Memoryprotectionchecking:actual(secure)使用SELinux 對進程進行沙箱處理默認情況下,沙箱工具利用多類別安全(MCS) 模型來實施細粒度的訪問控制和進程隔離。該模型根據每個進程和文件的安全級別和類別為其分配唯一的安全標籤。

讓我們在沙箱中運行/bin/bash 進程,以限制它訪問敏感文件或執行某些命令。

要創建沙箱並在其中啟動/bin/bash,我們使用沙箱命令,如下所示:

$sandbox-Hsandbox_test/bin/bash沙箱工具應用SELinux 策略將進程限制在沙箱內。這些策略定義進程的訪問權限、系統調用限制和文件限制。策略確保進程只能訪問沙箱配置允許的資源並執行操作。在幕後,它們生成隨機MCS 編號並將其設置為我們進程的SELinux 安全上下文。策略還標記了我們的流程可用的相應文件。

例如,將SELinux 沙箱用於/bin/bash 進程,主目錄位於sandbox_test 中,將導致ls -lZ我們的目錄出現以下輸出:

$ls-lZ|grepsandbox_test

drwxr-xr-x.2useruserunconfined_u:object_r:sandbox_file_t:s0:c146,c31249May306:50sandbox_test在我們的例子中,隨機MCS 數是c146和c312。 /bin/bash 進程使用這些數字運行,根據沙箱源代碼它將獲取SELinux 安全上下文執行命令:

$ps-eZ|grepbash

unconfined_u:unconfined_r:sandbox_t:s0:c146,c312172662?00:00:00bash該策略有效地將我們的bash 進程限制在其主目錄中。但是,此解決方案僅適用於特定文件夾,並限制對具有隨機MCS 編號的特定文件的訪問。具有相同主文件夾的另一個沙盒bash 會與此衝突。為了克服這一限制,我們可以利用沙箱工具及其源代碼的知識來創建自定義SELinux 策略,限制對特定SELinux 類型的訪問。

在接下來的部分中,我們將探討兩種類型的SELinux 策略:

马云惹不起马云寬鬆的策略,不會阻止任何連接,僅監視和記錄安全事件,包括違規行為。當您需要測試、調試或研究文件時,寬鬆策略非常有用。

马云惹不起马云 一種強制策略,用於建立文件的訪問權限並限制任何禁止的活動。它對於建立訪問管理和保護您的解決方案非常有用。

讓我們從建立一個寬鬆的SELinux 策略示例開始。

制定寬鬆政策要為/bin/bash 這樣的簡單進程創建SELinux 策略,我們可以使用該sepolicy generate命令。讓我們運行以下命令,為/bin/bash 進程生成策略文件,並將其命名mybash:

$sudosepolicygenerate--application/bin/bash-nmybashmybash.te 文件包含我們策略的人類可讀的SELinux 規則。接下來,我們需要啟用從unconfined_t 域到自定義mybash_t 域的轉換。為此,我們將以下宏包含在mybash.te 文件中:

unconfined_run_to(mybash_t,mybash_exec_t)該宏允許在執行/bin/bash 進程時在域之間進行轉換,並使我們能夠通過setexeccon為特定進程設置自定義SELinux 域類型。

我們的策略文件現在如下所示:

policy_module(mybash,1.0.0)

########################################

#

#Declarations

#

attribute_rolemybash_roles;

roleattributesystem_rmybash_roles;

typemybash_t;

typemybash_exec_t;

application_domain(mybash_t,mybash_exec_t)

rolemybash_rolestypesmybash_t;

unconfined_run_to(mybash_t,mybash_exec_t)

permissivemybash_t;

########################################

#

#mybashlocalpolicy

#

allowmybash_tself:capability{chownsetgidsetuid};

allowmybash_tself:process{forksetpgidsetrlimitsignal_perms};

allowmybash_tself:fifo_filemanage_fifo_file_perms;

allowmybash_tself:unix_stream_socketcreate_stream_socket_perms;

domain_use_interactive_fds(mybash_t)

files_read_etc_files(mybash_t)

auth_use_nsswitch(mybash_t)

logging_send_syslog_msg(mybash_t)

miscfiles_read_localization(mybash_t)

sysnet_dns_name_resolve(mybash_t)要為/bin/bash 進程安裝此自定義策略並允許/bin/bash 進程在指定的SELinux 上下文下運行,讓我們執行自動生成的腳本:

$sudo./mybash.sh要直接從bash shell 設置進程上下文,我們可以使用一個簡單的代碼片段。讓我們創建一個新文件,將其命名為set_context.c,並向其中添加以下代碼:

#includeselinux/selinux.h

#includestdio.h

#includestdlib.h

#includeunistd.h

#includeerrno.h

intmain(void){

security_context_tcontext_old={0};

security_context_tcontext_new={0};

if(getcon(context_old)==-1){

printf('Failedtogetcontext');

return1;

}

printf('%s\n',context_old);

if(setexeccon((security_context_t)'unconfined_u:unconfined_r:mybash_t:s0')==-1){

printf('Failedtosetcontexterrno%d\n',errno);

return1;

}

execve('/bin/bash',NULL,NULL);

return0;

}現在我們將構建並運行此代碼:

$gcc-omybashset_context.c-lselinux

$./mybash

$此代碼檢索當前SELinux 上下文,將新上下文設置為unconfined_u:unconfined_r:mybash_t:s0,然後使用更新的上下文執行/bin/bash 進程。

現在我們對/bin/bash 進程有了一個寬鬆的策略,並且可以在指定的SELinux 上下文中執行它。讓我們打開另一個終端並檢查/var/log/audit/audit.log。在這裡我們可以看到bash啟動後請求了什麼樣的權限:

type=AVCmsg=audit(1683645539.705:301246):avc:denied{append}forpid=173167comm='bash'name='.bash_history'dev='dm-1'ino=1225470scontext=unconfined_u:unconfined_r:mybash_t:s0tcontext=unconfined_u:object_r:user_home_dir_t:s0tclass=filepermissive=1

type=SYSCALLmsg=audit(1683645539.705:301246):arch=c000003esyscall=257success=yesexit=3a0=ffffff9ca1=55bdf355c5f0a2=401a3=0items=0ppid=172599pid=173167auid=1000uid=1000gid=1000euid=1000suid=1000fsuid=1000egid=1000sgid=1000fsgid=1000tty=pts2ses=32comm='bash'exe='/usr/bin/bash'subj=unconfined_u:unconfined_r:mybash_t:s0key=(null)ARCH=x86_64SYSCALL=openatAUID='sboy'UID='sboy'GID='sboy'EUID='sboy'SUID='sboy'FSUID='sboy'EGID='sboy'SGID='sboy'FSGID='sboy'

type=AVCmsg=audit(1683645539.705:301247):avc:denied{setattr}forpid=173167comm='bash'name='.bash_history'dev='dm-1'ino=1225470scontext=unconfined_u:unconfined_r:mybash_t:s0tcontext=unconfined_u:object_r:user_home_dir_t:s0tclass=filepermissive=1

type=SYSCALLmsg=audit(1683645539.705:301247):arch=c000003esyscall=92success=yesexit=0a0=55bdf355c5f0a1=3e8a2=3e8a3=55bdf355c7a0items=0ppid=172599pid=173167auid=1000uid=1000gid=1000euid=1000suid=1000fsuid=1000egid=1000sgid=1000fsgid=1000tty=pts2ses=32 comm='bash'exe='/usr/bin/bash'subj=unconfined_u:unconfined_r:mybash_t:s0key=(null)ARCH=x86_64SYSCALL=chownAUID='sboy'UID='sboy'GID='sboy'EUID='sboy'SUID='sboy'FSUID='sboy'EGID='sboy'SGID='sboy'FSGID='sboy'請注意包含所請求權限類型和模式的拒絕字段permissive=1,這實際上意味著此SELinux 策略允許這些權限,並且只是在audit.log 中警告它們。

現在,讓我們在自定義bash 進程中執行ls 命令,看看不帶參數執行此命令需要什麼:

type=AVCmsg=audit(1683645670.511:301248):avc:denied{read}forpid=173244comm='ls'name='setcon'dev='dm-1'ino=1211972scontext=unconfined_u:unconfined_r:mybash_t:s0tcontext=unconfined_u:object_r:user_home_t:s0tclass=dirpermissive=1

type=SYSCALLmsg=audit(1683645670.511:301248):arch=c000003esyscall=257success=yesexit=3a0=ffffff9ca1=562f22c913d0a2=90800a3=0items=0ppid=173219pid=173244auid=1000uid=1000gid=1000euid=1000suid=1000fsuid=1000egid=1000sgid=1000fsgid=1000 tty=pts2ses=32comm='ls'exe='/usr/bin/ls'subj=unconfined_u:unconfined_r:mybash_t:s0key=(null)ARCH=x86_64SYSCALL=openatAUID='sboy'UID='sboy'GID='sboy'EUID='sboy'SUID='sboy'FSUID='sboy'EGID='sboy'SGID='sboy'FSGID='sboy'有了ls,我們可以繼續處理/bin/bash 進程並了解如何使用SELinux 強制執行訪問控制。

制定執行政策audit.log 文件中的SELinux 日誌描述了/bin/bash 進程執行的操作。我們將通過註釋掉“permissive”行並刪除任何其他自動生成的權限來禁用自定義策略中的permissive 模式。此後,該策略將生效,這意味著SELinux 將阻止所有不需要的訪問嘗試。

更新後的政策現在如下所示:

policy_module(mybash,1.0.0)

########################################

#

#Declarations

#

attribute_rolemybash_roles;

roleattributesystem_rmybash_roles;

typemybash_t;

typemybash_exec_t;

application_domain(mybash_t,mybash_exec_t)

rolemybash_rolestypesmybash_t;

unconfined_run_to(mybash_t,mybash_exec_t)

#permissivemybash_t;

########################################

#

#mybashlocalpolicy

#

#allowmybash_tself:capability{chownsetgidsetuid};

#allowmybash_tself:process{forksetpgidsetrlimitsignal_perms};

#allowmybash_tself:fifo_filemanage_fifo_file_perms;

#allowmybash_tself:unix_stream_socketcreate_stream_socket_perms;

#domain_use_interactive_fds(mybash_t)

#files_read_etc_files(mybash_t)

#auth_use_nsswitch(mybash_t)

#logging_send_syslog_msg(mybash_t)通過刪除權限,我們有效地限制了/bin/bash 進程的SELinux 上下文。讓我們安裝更新的策略並嘗試運行新的自定義bash:

$sudo./mybash.sh

$./mybash但是,這只會在日誌中產生一行:

type=AVCmsg=audit(1683646222.408:301270):avc:denied{entrypoint}forpid=173428comm='mybash'path='/usr/bin/bash'dev='dm-1'ino=16959619scontext=unconfined_u:unconfined_r:mybash_t:s0tcontext=system_u:object_r:shell_exec_t:s0tclass=filepermissive=0不幸的是,我們的bash 進程缺乏啟動所需的權限。為了解決這個問題,讓我們使用命令生成權限audit2allow並更新我們的策略:

$echo'type=AVCmsg=audit(1683646222.408:301270):avc:denied{entrypoint}forpid=173428comm='mybash'path='/usr/bin/bash'dev='dm-1'ino=16959619scontext=unconfined_u:unconfined_r:mybash_t:s0tcontext=system_u:object_r:shell_exec_t:s0tclass=filepermissive=0'|audit2allow-r

require{

typemybash_t;

typeshell_exec_t;

classfileentrypoint;

}

#=============mybash_t==============

allowmybash_tshell_exec_t:fileentrypoint;接下來,讓我們將生成的行添加到mybash.te 文件的末尾並安裝更新的策略:

$sudo./mybash.sh

$./mybash

Segmentationfault即使進行這些修改後,bash 進程仍然無法啟動,從而導致分段錯誤。所以我們需要將這一行添加到audit.log中:

type=AVCmsg=audit(1683646840.208:301287):avc:denied{map}forpid=173620comm='bash'

如何應用人工智能來檢測社交媒體上的異常情況人工智能和機器學習算法是異常檢測系統的核心,因為它們負責分析社交媒體上的異常帖子。根據您的目標,您可以讓人工智能處理各種類型的內容、評估帳戶的可信度、分析特定類型的異常情況等。

我們來看看AI 對不同類型內容進行異常檢測的能力:

image.png

文本分析。除了TikTok 和YouTube 等以視頻為中心的平台外,流行社交媒體渠道上的大多數帖子都是基於文本的。使用人工智能分析它們可以為您提供比簡單的關鍵字搜索更多的信息。人工智能可以確定作者的情緒、解釋隱喻、破譯網絡俚語和編碼信息。它甚至可以理解幽默並檢測虛假陳述。這些人工智能功能可幫助異常檢測軟件標記異常並進行徹底分析。

圖像分析。基於人工智能的圖像分析有助於識別圖像內容:文本、對象和整體上下文。從圖像中讀取文本可以處理帶有文本疊加的帖子,這在Facebook 等平台上很流行。圖像處理算法從圖像中挑選出文本後,文本分析算法可以像處理普通文本記錄一樣處理它。

當涉及到圖片、屏幕截圖和其他圖像時,您可以使用各種圖像處理算法來識別對象、分割和分類圖像、搜索模式等。您還可以使用AI修復圖像失真,以改善分析結果。

視頻分析。仔細分析後,社交媒體上發布的視頻可能是安全相關信息的重要來源。人工智能算法可以檢測物體、動作、人,甚至識別情緒,並對不同的視頻進行分類。他們可以幫助偵查暴力、尋找失踪人員,並在大型活動中提供安全概覽。

請注意,與構建用於分析文本和圖像的解決方案相比,構建用於視頻分析的AI 解決方案是一項更具挑戰性但可以實現的任務。它需要收集不同的數據庫,進行廣泛的算法訓練,並使用大量的硬件能力來處理視頻。

現在讓我們看一下對於社交網絡異常檢測有用的人工智能算法的任務。請記住,解決方案的SaaS 部分可以執行所有非智能任務,例如網絡爬行和存儲數據。

image.png

上下文感知文本翻譯。對於國際組織來說,發現世界各地社交媒體上的異常帖子非常重要。此任務需要異常檢測軟件中的翻譯模塊。使用非人工智能翻譯器會降低軟件的效率,因為此類翻譯器不擅長處理上下文、隱喻和引用、語法錯誤和拼寫錯誤。

相反,您可以添加DeepLPython 庫中的API、OpenAI 中的ChatGPT 、Google Cloud 中的Translation AI或任何其他翻譯服務。選擇一項時,請考慮您的軟件使用的技術、開發團隊的專業知識、人工智能服務的功能以及翻譯成本。

威脅概率估計。並非社交媒體上所有不尋常的帖子都必須被標記為可疑。例如,網上的激烈爭論可能不會產生任何結果,或者會導致現實世界的騷擾。人工智能可以估計威脅真實存在的概率。為此,算法可以評估作者是人類還是機器人,分析作者之前的帖子,並確定可疑帖子的情緒。

威脅評估的結果將幫助審查社交媒體異常的專家做出決策,並對異常情況做出更快的反應,從而證明響應的合理性。對於此任務,您可以使用現成的AI 模型進行時間序列分析和自然語言處理。您還可以利用spaCY、NLTK、scikit-learn和Gensim等Python 庫。

風險分類和評分。除了評估威脅之外,人工智能和機器學習算法還可以評估已發現異常的重要性或嚴重性,並為其分配風險評分。風險評分可幫助使用異常檢測系統的專家儘早、快速地解釋結果並做出響應。

由於風險評估是AI 和ML 的常見用例,因此有許多適用於各種任務、行業和特定案例的風險分類AI 算法[PDF]。您可以找到一種或多或少適合您的項目的算法,而不是從頭開始開發算法。但是,請記住,您需要使用數據集訓練此算法,並根據您的特定任務進行調整。

儘管功能強大,人工智能驅動的異常檢測仍然嚴重依賴與該系統合作的專家。人工智能只能準備有關異常的信息供人類審查,從而節省專家的時間和精力。但它無法對威脅概率做出最終決定並選擇處理異常的最佳方法。

異常檢測解決方案的效率還很大程度上取決於其實施的好壞。讓我們看看您在進行異常檢測時可能面臨的主要挑戰以及如何克服這些挑戰。

構建基於SaaS 的異常檢測解決方案面臨哪些挑戰?提供如此復雜的解決方案需要雲應用程序開發、人工智能開發甚至合規法方面的專業知識。以下是您的團隊在開發社交媒體異常檢測SaaS 解決方案時可能遇到的主要挑戰:

image.png

用於人工智能訓練的數據集。任何人工智能算法都需要在相關數據集上進行訓練,然後才能應用於現實場景。準備用於異常檢測的數據集包含幾個挑戰。異常檢測算法必須依賴於準確、一致、有效和平衡的數據來進行有效的異常檢測。必鬚根據算法應檢測的異常類型來標記數據。數據集還必須定義什麼構成正常數據和異常數據。

找到適合特定用途的現成數據集幾乎是不可能的,這就是開發團隊經常手動創建數據集的原因。此過程可能非常耗時,並且需要開發和領域專業知識。另外,請記住,您的解決方案在發布後可能需要額外的培訓,以提高其結果的準確性或教它檢測新威脅。

API 限制。在異常檢測解決方案中包含第三方組件及其API 是減少開發時間和成本的好方法。但是,它為您的解決方案帶來了一系列限制。例如,API 限制可能會限制可訪問的數據量和類型,這可能會阻礙異常檢測解決方案的準確性和有效性。 API 還可能具有限制請求頻率和數量的速率限制。此外,API 方面的任何更新都可能破壞集成功能或引入安全風險。

完全預測和克服與API 相關的挑戰是不可能的,但您可以在集成第三方產品之前通過徹底研究第三方產品來為這些挑戰做好準備。

雲硬件的價格。人工智能算法可能需要大量計算能力來處理信息。在雲服務上託管異常檢測解決方案可以讓您避免人工智能發展熱潮導致的硬件瓶頸、擴展問題和可能的硬件短缺。然而,如果不調整算法,租用雲資源的成本可能會快速上升。

為了控制云成本,請明確定義您要監控哪些社交媒體內容以及您希望軟件處理多少信息。確保人工智能僅執行需要智能算法的任務,所有其他任務均由資源消耗較少的非人工智能工具完成。

監管合規性。監控社交媒體的異常檢測解決方案需要存儲有關檢測到的異常和分析結果的信息。根據法律要求保護這些信息可以讓您既確保數據安全又避免違規問題。

這裡的挑戰是缺乏使用人工智能進行異常檢測的法規。雖然沒有專門針對此類解決方案的實踐,但您可以依賴GDPR 等國際法規以及當地的數據保護法律和標準。

內置偏置。人工智能解決方案不可能完全沒有偏見和公平,因為它繼承了創建它的開發團隊的偏見。該團隊根據他們的經驗、心態以及社會和專業背景選擇算法、開發工具和數據進行培訓。人工智能偏見給異常檢測帶來了道德和質量挑戰。

雖然不可能完全消除偏見,但您可以通過以下方式降低將偏見引入AI 模型的風險:

提高開發過程的透明度

收集多樣化的訓練數據集

廣泛測試您的解決方案

聚集多元化的項目團隊

需要利基專業知識。提供複雜的人工智能解決方案需要您聚集具有不同專業知識的專家:人工智能和機器學習開發、SaaS 開發、雲基礎設施管理、網絡安全、目標行業的專業經驗。組建如此多元化的團隊對任何公司來說都是一個挑戰。保留專家團隊也會導致預算增加。

結論監控社交媒體並檢測異常帖子可以幫助您完成各種任務:防止安全威脅、打擊恐怖主義、發現新趨勢和主題等等。使用人工智能進行異常檢測可以幫助專家節省手動工作時間並進行更高質量的異常分析。與手動異常檢測相比,在雲中部署此類解決方案可以降低維護成本並提高準確性。

社交媒體帖子是熱門且有價值的信息的來源。雖然大多數人使用社交媒體討論貓、狗、名人以及孩子相關話題,但也有一些帖子呼籲暴力、討論網絡安全攻擊和宣布突發新聞。但在不斷增長的內容堆中手動發現此類帖子或異常幾乎是不可能的。

在本文中,我們將討論借助人工智能(AI) 算法和Python 工具構建此類解決方案的關鍵組件。本文對於計劃開發社交媒體異常檢測解決方案的項目經理、AI 團隊和SaaS 開發團隊非常有用。

為什麼要檢測社交媒體上的異常情況?人工智能如何提供幫助?在IT 系統中,異常是指偏離預期的事件或數據記錄。在社交媒體背景下,異常檢測有助於分析事件、趨勢或個性,並捕捉個人和群體行為的有意義的變化。非典型用戶行為、熱門新話題和仇恨言論都可以被視為異常。

以前,此類工作是手動完成的。例如,警察可以監控社交網絡上的當地群體以發現威脅,記者可以在社交媒體上尋找新的故事和討論主題。

現在,人工智能驅動的技術使組織能夠自動化這些活動。使用機器學習(ML) 和人工智能算法來檢測異常更加有效,原因如下:

image.png

儘管有這些好處,基於人工智能的異常檢測無法取代分析異常並根據該分析做出決策的專家。這樣的解決方案只能節省數據收集和初步分析的時間。

誰可以從社交媒體異常檢測解決方案中受益?社交網絡不再只是與朋友交談的地方。人們用它們來開展業務、閱讀和發布新聞,甚至計劃事件和活動。這就是為什麼許多組織需要監控社交網絡以發現不同類型的異常情況。

社交媒體上基於人工智能的異常檢測對於在各個行業運營的組織非常有用:

image.png

社交網絡。任何社交網絡都必須能夠檢測和阻止仇恨言論、虛假新聞、冒充和機器人攻擊等事件。社交網絡開發人員可以依靠支持員工和用戶報告來檢測此類威脅,但這需要大量時間和金錢。相反,他們可以實施基於人工智能的異常檢測,以確保為用戶提供舒適的環境。

公共行政。防止對人民的威脅是任何政府的主要目標之一。監控社交媒體上的文本和視頻使政府組織能夠發現違反公共秩序、身體虐待、對國家安全的威脅以及其他類型的潛在非法活動。它對於揭露發生在公眾視野之外的事件(例如家庭暴力和非法交易)特別有用。

軍事。國家和國際軍事組織監控社交媒體以發現潛在的軍事威脅並收集情報。社交媒體上的異常對於開源情報(OSINT)操作也很重要,因為它們可能表明信息洩露、隱藏的用戶個人資料、未經宣布的軍事行動等。

網絡安全。對於網絡安全專家來說,與安全相關的社交媒體中的異常可能是潛在惡意活動的跡象。它們可以揭示黑客企圖、內部攻擊、數據洩露等的準備情況。此類數據有助於防止安全威脅並改善組織的整體網絡安全狀況。

教育。學生的人身安全是教育組織日益關注的問題。通過社交媒體監控和異常檢測,學校和大學可以隨時了解校園內的討論以及來自外部的可能威脅。

新聞媒體。監控社交媒體上的帖子是任何記者日常工作的重要組成部分。記者尋找新聞、專家意見和新趨勢,從數據分析的角度來看,這些都是異常現象。為這項任務應用專用的異常檢測解決方案可以為新聞媒體組織的員工節省大量時間,並使他們能夠更快地發布新聞。

如此廣泛的用例意味著不可能有一種一刀切的社交媒體異常檢測解決方案。您可以使用各種開發方法和工具來構建適合您確切需求的解決方案。

Python為開發人員提供了大量的AI開發工具和廣泛的集成選項。這種語言有幾個專用於人工智能開發的包和大量庫。使用它們可以大大減少開發時間,因為在大多數情況下,您不需要發明自己的解決方案。如果您這樣做,您可以從詳細的Python 文檔和強大的社區獲得幫助。

在雲中部署異常檢測解決方案可讓您受益於所有SaaS 優勢:24/7 可用性、通過互聯網連接從任何位置和設備進行訪問、經濟高效的資源使用等等。如果考慮到人工智能發展的蓬勃發展可能導致GPU 短缺,訪問云硬件也很方便。

讓我們看一下可以幫助您檢測社交媒體上的異常情況的關鍵非人工智能功能。

哪些SaaS 功能對於異常檢測很重要?讓我們仔細看看設計異常檢測系統時需要注意的核心功能:

image.png

存儲和數據庫。異常檢測解決方案收集、處理和生成大量數據。您可以使用Amazon S3或Google Cloud Storage等雲服務來存儲這些數據。對於數據庫,請考慮使用Apache Cassandra或MongoDB,因為它們都可以有效管理大量通用數據,並且可以在重負載下快速工作。

網絡爬蟲。這部分解決方案必須搜索社交媒體並下載數據供人工智能分析。您可以配置爬蟲下載的數據類型。根據您項目的需求和要求,您可以使用Scrapy等開源框架來實現網絡爬蟲或開發自定義功能。 Python 提供了可用於此任務的Request和Beautiful Soup庫。

警報和通知。使用雲和人工智能進行異常檢測的主要優勢之一是近乎實時地標記異常內容。為了幫助用戶快速分析和響應異常情況,您可以以桌面消息、電子郵件和消息通知的形式實施警報。 Gmail、Slack 和Telegram 等常見通信工具提供了API,您可以將其集成到您的解決方案中,以通過您首選的通信渠道自動發送通知。

內容過濾器。為了能夠在異常檢測解決方案收集的一堆數據中找到某個事件,最終用戶需要一個過濾系統。您可以在解決方案中構建基本過濾器,並為用戶提供配置自定義過濾器的能力。例如,考慮添加內容源、內容類型、發現日期、檢測到的異常和可信度的過濾器。為了實現此類過濾器,Python 提供了PyOD、tsfresh、anomatools、PyCaret、anomalize和其他庫。

儀表板和數據可視化。此功能顯著簡化了數據分析,並幫助用戶在檢測到的異常中找到模式。將儀表板與數據過濾器相結合,用戶可以分析一段時間內的特定異常,將其與其他異常進行比較,合併多個來源的數據,創建報告等。您可以使用Matplotlib、Folium、Seaborn和其他Python 庫實現各種數據可視化選項。

用戶管理。每個最終用戶都必須擁有一個具有一定權限級別的配置文件、登錄憑據以及用戶信息(例如ID、姓名、頭像、角色等)。用戶管理允許管理員創建、編輯和刪除用戶,根據權限配置其功能。他們的角色,並控制用戶活動。您可以查找適合您需求的可用用戶管理模塊,或者使用Flask或Django實現自定義模塊。

身份和訪問管理。控制對用戶帳戶和用戶權限的訪問是確保解決方案安全的重要步驟之一。考慮實施多重身份驗證,以識別使用Google Authenticator或2FA Authenticator等現成工具訪問系統的用戶。您還可以添加用戶角色、組和訪問限制,以允許解決方案管理員控制用戶訪問。

這些核心功能將使最終用戶能夠有效地與異常檢測解決方案進行交互。請記住,此列表並不詳盡,您的解決方案可能需要其他功能,具體取決於您的用例和產品要求。

在下篇文章中,讓我們看看人工智能在哪里以及如何檢測異常。

高質量圖像對於包括安全和車載攝像系統在內的各種解決方案以及開發和訓練用於圖像處理任務的機器學習算法至關重要。

然而,物理相機傳感器經常會導致照片失真。這些扭曲會顯著降低圖像質量,甚至使您的解決方案無法處理圖像。

在本文中,我們將探討什麼是圖像失真以及消除它們的重要性。我們還展示瞭如何使用OpenCV 修復圖像失真。本文對於致力於具有圖像處理功能的IT 解決方案、想要了解有關修復圖像失真的更多信息的企業和開發團隊將有所幫助。

什麼是圖像失真?它們如何影響您的解決方案的性能?圖像失真通常是圖形圖像與其現實原型的不成比例、不充分的偏差。例如,現實生活中的直線或平行線可能會出現變形或不自然的彎曲。另一個例子是與照明相關的扭曲,例如當顏色朝圖像邊界變暗時,類似於漸暈。

並非所有的扭曲都是不利的。例如,您可能希望在使用廣角鏡頭拍攝的圖像中保留特定的畸變,以突出顯示前景和背景之間的距離。

然而,通常情況下,您需要相機來拍攝精確的圖像。對於某些技術來說,獲得零失真的圖像至關重要。

1701422944707.png

確保圖像無失真對於開發機器學習(ML) 解決方案和訓練人工智能(AI) 網絡執行圖像處理任務極其重要。

訓練數據集必須一致(相似的示例必須具有相似的標記)且統一(所有屬性的值必須在所有數據中具有可比性)。質量差的數據集會降低人工智能算法訓練過程的效率。

在某些情況下,可以故意將扭曲的圖像放置在數據集中。例如,您可能想要訓練算法來處理由具有不同失真的不同相機拍攝的圖像。然而,如果來自不同相機的圖像在扭曲的形式和程度方面存在顯著差異,那麼將此類圖像包含在一個數據集中將破壞一致性和均勻性要求。因此,不可能有效地訓練人工智能算法來提供所需的結果。

圖像質量對於使用計算機視覺和增強現實(AR) 技術的軟件也至關重要。

假設您正在使用一個複雜的解決方案,該解決方案使用兩個或更多相機從不同角度拍攝照片。您可能需要組合多個圖像才能接收三維圖像,就像車輛360 度攝像頭系統中使用的圖像一樣。或者您可能希望通過拼接多張照片來擴展視圖,以生成整個場景的高分辨率全景圖像。如果不校準(切除)相機傳感器,連接圖像之間的拼接將是可見的。

要解決這些問題,您需要修復圖像失真。在討論如何做到這一點之前,我們先簡要探討一下此類扭曲的常見類型。

圖像失真的類型為了有效地校正圖像,首先必須了解您正在處理什麼類型的失真。圖像畸變有兩種類型:徑向畸變和切向畸變。

當光學傳感器與光學透鏡成角度放置時,會發生切向畸變。

image.png

以下是拍攝方形物體時切向畸變如何工作的示例:

image.png

徑向畸變是指從圖像中心到邊緣的線條曲率,反之亦然。徑向畸變分為三種類型:

1.當圖像放大率隨著距光軸的距離而減小時,就會出現桶形畸變。

2.當圖像放大倍數隨著距光軸的距離而增加時,就會出現枕形畸變。

3.小鬍子失真(也稱為波形失真)比前兩種類型發生的情況要少得多,並且本質上是它們的混合。鬍鬚畸變開始時是靠近圖像中心的桶形畸變,並逐漸變成朝向圖像外圍的枕形畸變。

徑向畸變的類型取決於鏡頭的類型和形狀——鏡頭越彎曲,最終圖像中的線條越彎曲。讓我們比較一下輸入網格在沒有失真的情況下與使用導致不同類型徑向失真的鏡頭拍攝時的樣子:

image.png

考慮到這一點,我們來討論如何消除圖像失真。

如何修復圖像扭曲一些現代相機具有先進的鏡頭系統,旨在最大限度地減少最終圖像的失真;然而,他們無法完全消除它們。不太先進的相機可以提供有關需要進行哪些更改才能消除失真的信息。

而通常用於開發定制設備的最簡單的相機則不具備這些功能。要修復失真,您首先需要根據傳感器的實際實驗確定必要的更改。

簡單的傳感器很普遍,因為它們批量生產的成本低廉。即使一個傳感器的設計存在微小差異,也會顯著提高整批傳感器的價格。

如果您的相機鏡頭產生圖像失真該怎麼辦?

拍攝圖像後,您可以使用編程方法修復失真。這樣,您可以為特定相機創建算法,並使用該算法自動修復該相機拍攝的所有圖像的扭曲。

要創建可以檢測和修復圖像失真的算法,您可以使用以下工具:

马云惹不起马云開放CV。一個開源計算機視覺和機器學習軟件庫,擁有2,500 多種優化算法。您可以使用這些算法來拼接圖像、檢測和識別人臉、識別物體、跟踪移動物體、提取物體的3D 模型等。 OpenCV 庫為計算機視覺解決方案提供了通用基礎設施,有助於加速機器感知在商業中的使用產品。

马云惹不起马云四月標籤。一種視覺基準系統,可用於不同的任務,包括增強現實、機器人和相機校準。 AprilTag 庫旨在輕鬆包含在其他應用程序中,以及移植到嵌入式設備。

马云惹不起马云計算機視覺工具箱。商業工具集,提供用於設計和測試計算機視覺、3D 視覺和視頻處理系統的算法、函數和應用程序。它還允許您自動執行單鏡頭、立體和魚眼相機的校準工作流程。

马云惹不起马云ShiftN。自動鏡頭畸變校正軟件特別適用於建築圖像。首先,ShiftN 搜索圖像中的直線和邊緣,並考慮那些足夠垂直的可能的建築元素。然後,軟件運行一個優化過程,嘗試確定透視,校正圖像,使線條平行。

在本文中,我們展示了一個使用OpenCV 確定和修復圖像失真的實際示例,因為該庫具有豐富的圖像處理功能並且可以免費使用。此外,我們在這方面擁有豐富的經驗。

如何使用OpenCV 庫識別和修復圖像失真OpenCV 是修復圖像失真的好工具。該庫提供了校正圖像和校準相機傳感器的廣泛功能。它支持各種相機型號,並涵蓋尋找畸變係數和修復畸變的不同方法。但首先,您需要知道如何使用OpenCV 識別圖像失真。

默認情況下,OpenCV 使用針孔相機模型。校準方法確定用於校準的模型以及將在模型上使用的標記。相機模型決定了計算相機矩陣的算法以及要使用的畸變係數的數量。讓我們定義這些術語:

马云惹不起马云相機矩陣是將點從三維場景映射到二維圖像的數學模型,在使用畸變係數修復相機畸變時使用。

马云惹不起马云畸變係數描述圖像中的某些畸變。失真越複雜,描述和消除它們所需的係數就越多。 OpenCV 可以計算最多六個徑向失真係數和最多兩個切向失真係數。

現在,讓我們嘗試確定使用OpenCV 針對特定傳感器檢測和消除圖像失真所需的係數。

image.png

1. 生成相機標定模型用於相機校準的模型(也稱為板)分為三種類型:

1.Chessboard

2.ArUco board

3.ChArUco board, which combines Chessboard and ArUco

它們是這樣的:

image.png

對於我們的示例,我們使用ChArUco 板,因為與標記角相比,它的角要準確得多。

要在OpenCV 中生成ChArUco 板,請使用以下代碼:

image.png

結果,您將收到以下模型:

image.png

2. 打印出實體模型並拍幾張照片您使用要校準的相機傳感器拍攝的照片越多,並且板在不同圖像中的放置越多樣化,您能夠計算的係數就越準確。

假設您收到以下圖像並發現您的傳感器導致徑向失真:

image.png

接下來,將接收到的圖像上傳到cv:Mat inImag變量。

3. 檢測圖像中的ArUco標記要檢測ArUco 標記,請對每個圖像使用以下代碼:

image.png

結果,ArUco 標記的角點坐標和標記的ID 將記錄在corners和ids變量中。以下是找到的標記在圖像中的樣子:

image.png

4. 檢測圖像中的ChArUco 標記使用檢測到的ArUco 標記來查找ChArUco 標記,代碼如下:

image.png

檢測到的ChArUco 標記如下所示:

image.png

正如您所看到的,ChArUco 標記位於ArUco 標記之間的角落(這就是我們需要首先找到ArUco 標記的原因)。

5. 校準相機以確定畸變係數並構建相機矩陣找到ChArUco 標記的邊緣和ID 後,您就可以開始校準相機:

repError=aruco:calibrateCameraCharuco(allCharucoCorners,allCharucoIds,charucoboard,imgSize,cameraMatrix,distCoeffs,rvecs,tvecs,calibrationFlags);運行上面的代碼後,您將得到:

马云惹不起马云 填充後的圖像矩陣(cameraMatrix)

马云惹不起马云畸變係數(distCoeffs)

马云惹不起马云旋轉向量(rvecs)

马云惹不起马云平移向量(tvecs)

現在您知道了失真係數,您可以開始使圖像不失真。

6.修復變形要修復OpenCV 中的徑向畸變,您只需要圖像矩陣和畸變係數:

image.png

不失真inputImage函數使用校準期間找到的係數(cameraMatrix和)來修復圖像失真( )distCoeffs。最終圖像記錄在outputImage中。

與上面提到的所有其他函數一樣,非扭曲函數默認使用針孔相機模型。對於其他相機模型,OpenCV 具有類似的功能,用於識別圖像中的標記、校正圖像和消除失真。當使用其他相機型號時,包含失真係數的矩陣的數量和格式可能會有所不同。因此,您不應該同時使用不同相機型號的函數,因為這會導致OpenCV 運行出現錯誤。

對於使用已校準的傳感器拍攝的所有圖像,您檢測到的畸變係數將是正確的,而不僅僅是用於校準的那些圖像。這使您可以校準相機一次,然後使用為之後拍攝的所有圖像確定的係數。

以下是修復圖像失真之前和之後圖像的示例:

image.png

如果您正在處理特別複雜的圖像扭曲,您可能需要嘗試另一種更準確的方法來查找圖像上的ChArUco 標記:

马云惹不起马云查找ArUco 標記

马云惹不起马云準備ArUco 標記以進行相機校準

马云惹不起马云校準相機以獲得畸變係數和圖像矩陣

马云惹不起马云使用接收到的係數和矩陣來插值ChArUco 標記

為了確保ChArUco 標記的插值,請使用以下代碼:

aruco:interpolateCornersCharuco(corners,ids,image,charucoBoard,charucoCorners,charucoIds,cameraMatrix,distCoeffs);在圖像失真複雜的情況下,這要準確得多。它可以顯著提高標記檢測的準確性,但需要更多時間。

您可以使用重投影誤差值來評估標記檢測的準確性,您可以在調用該aruco:calibrateCameraCharuco函數後看到該值。校準相機時,最好使用重投影誤差值不超過一定限制的圖像。您可以決定您的算法可接受的錯誤限制是多少。通常,它是1 到3 之間的值。

如果重投影誤差值超出您的限制,則無法使用此類圖像進行相機校準。如果您最終由於這種原因排除了太多圖像,請考慮使用第二種方法查找標記。

您可以在Apriotit GitHub 頁面上找到本文中使用的示例的完整代碼。

注意:校準傳感器和修復失真的方法比我們在本文中描述的方法要多。您還可以使用:

马云惹不起马云OpenCV 提供的其他功能。例如,您可以嘗試ArUco 校准或配置魚眼和全向相機等相機型號的設置。

马云惹不起马云替代工具,例如AprilTag 或Computer Vision Toolbox。

沒有一種靈丹妙藥可以完美適用於所有傳感器。要選擇最合適的相機校準方法,請考慮特定傳感器的具體情況以及鏡頭的配置和形式。

結論OpenCV 是一個強大的圖像校正工具,在本文中,我們只解決了它的一小部分功能。一般來說,OpenCV 適合大多數情況,並且允許您顯著改善圖像的幾何形狀和質量,而無需使用複雜的鏡頭和傳感器。

Nmap是Network Mapper(網絡映射器)的縮寫,是一個用於端口和IP掃描以及應用程序檢測的開源工具。網絡和系統管理員將其用於清點網絡資產、管理服務升級計劃和監視服務正常運行時間。

起初,它是作為一款Linux工具而開發的,但現在也可用於Windows和MacOS。用戶還可以在Solaris、AIX或Amiga OS等不太常見的系統上使用Nmap。源代碼以C、C++、Perl和Python等版本提供,可以定制該工具以適用於不同的環境。

管理員用Nmap進行滲透測試,檢查哪些設備在其網絡上運行,Nmap還使他們能夠查看哪些端口是敞開的,並發現潛在的漏洞。

Nmap有什麼用途?大致說來,Nmap允許用戶進行快速的網絡映射,可以幫助團隊優化並保護網絡和數據。它被用於滲透測試、道德黑客活動以及進行其他目的。它最近的一項用途是分析網站服務器和物聯網設備之間的流量。

Nmap由美國網絡安全專家Gordon Lyon開發,下面將逐一介紹Nmap工具的最重要功能:

網絡映射Nmap向用戶顯示哪些類型的設備連接到網絡並使用掃描端口。借助這個命令,用戶可以看到服務器、路由器、交換機及其他設備是如何連接的,他們還可以了解它們如何協同工作,並進一步設想網絡圖。

端口掃描用戶可以使用Nmap檢查哪些端口是敞開的,哪些端口是關閉的。這項功能對於IT團隊來說非常方便,因為他們可以用它來查看防火牆是否在正常工作,對於那些想要防範端口掃描攻擊的人來說,它也派得上用場。

漏洞掃描Nmap還有助於發現網絡容易受到特定威脅攻擊的程度。當發現一個影響特定軟件或軟件版本的新漏洞時,Nmap可以顯示是否有任何連接的機器使用該應用程序,然後IT團隊收到警告,可以通過及時修補系統來避免網絡攻擊。

採集操作系統指紋幫助IT團隊發現設備上運行的所有類型的操作系統。通過這個過程,他們還可以查明這台機器是什麼品牌(戴爾、宏碁或聯想等)。但更有意思的是,IT團隊還可以確定操作系統的補丁級別和端點的估計正常運行時間。

檢查影子ITNmap可以顯示連接到網絡的機器的類型和位置,這有助於管理員發現任何未經正式授權就連接到其網絡的設備(影子IT)。影子IT通常是隱藏的,即使這些機器不一定是惡意的,它們也可能是整個系統面臨的一個風險因素,危險在於設備不包括在網絡安全程序中,享受不到補丁管理策略的益處等。

服務發現與其他映射工具不同,Nmap有助於發現網絡中每個設備的角色。它顯示哪個設備是郵件或網站服務器、哪個是存儲設備、哪個是數據庫存儲庫等。此外,Nmap還顯示正在運行中的應用程序,甚至顯示使用中的應用程序版本。

如何在Linux中使用Nmap? Linux用戶可以使用來自Insecure.Org的二進制軟件包或者安裝發行版的源代碼。

•二進制軟件包通常是一種安裝起來更快速、更輕鬆的選擇。但是它們必須稍加定制,才能使用發行版的標準目錄路徑。此外,這些軟件包支持定期管理,以便對系統上的軟件進行升級、卸載或審計。然而,發行版創建的軟件包總是落後於Nmap.Org源版本,這顯然是一個缺點,即使大多數Linux發行版保持相當頻繁的更新節奏。

•使用源代碼安裝可以讓用戶更好地控制如何為其係統開發和定制Nmap,可以在官方Nmap頁面(https://nmap.org/book/inst-source.html)上找到更多的相關信息。

如何在Windows上運行Nmap?自2000年發布以來,Windows版本已成為使用Nmap的第二大流行平台。 Windows用戶可以在安裝Nmap的三種方法中進行選擇:

•Windows自安裝程序——這是最容易使用的選項,它是大多數用戶青睞的選擇。它還使用戶能夠安裝Zenmap GUI及其他工具。

•命令行Zip二進製文件——Nmap版本將Windows命令行二進製文件和關聯文件合併到Zip壓縮包中。另一方面,沒有圖形化界面,所以用戶必須打開DOS/命令窗口來運行exe文件。

•從源代碼編譯——對於那些願意幫助開發Nmap的人來說,從源代碼編譯是最好的選擇。為此,你需要Microsoft Visual C++ 2019。任何Visual Studio 2019版本都可以使用,包括免費的Visual Studio 2019社區版。

可以在這裡(https://nmap.org/download.html)找到這三種選擇的更多信息和安裝步驟。

如何在MacOS上運行Nmap?用戶可以使用面向Apple macOS (x86-64)平台的Nmap二進製文件,它作為含有安裝程序的磁盤映像文件而存在。安裝程序支持Nmap、Zenmap、Ncat和Ndiff,這些程序在Mac OS X 10.9和其他更新版本上進行了測試。

MacOS用戶也有安裝Nmap的更多選擇:

•可執行安裝程序——這是在Mac設備上安裝Nmap或Zenmap的最簡單方法。

•從源代碼編譯——這需要蘋果的開發工具Xcode。因為它不是默認安裝,所以必須從Mac應用程序商店免費下載。

•使用第三方軟件包——在MacOS上安裝Nmap的第三種選擇是使用一個打包Unix軟件的系統。 Nmap官方頁面推薦使用Fink或MacPorts。

與Windows一樣,在MacOS上運行Nmap的第一步是從這裡(https://nmap.org/download.html#macosx)下載。然後按照操作說明(https://nmap.org/book/inst-macosx.html),在MacOs上正確安裝和運行Nmap。

除Nmap之外的另外5款開源網絡掃描工具Nmap可能是最出名的網絡掃描工具,但它肯定不是唯一的。下面是另外一些主流的類似選擇:

•Metasploit框架Metasploit起初是一個開源滲透測試工具。它現在是一個商業網絡掃描工具,用於網絡漏洞檢測。

•SnortSnort是一個開源免費的網絡入侵檢測工具。它基於協議分析和內容檢查,可以檢測不同類型的網絡漏洞(比如蠕蟲),並且可以掃描端口。

•OpenSSH這個開源工具專門用於UNIX環境。 SSH是Secure Shell的縮寫,在不受信任的主機之間通過不安全的網絡鏈路建立安全的加密通信機制。它通過加密網絡流量來消除諸多網絡問題:竊聽不可信的連接和劫持兩台主機之間的連接。

•OpenVAS這是另一個免費的網絡安全掃描工具。它提供全面的網絡掃描、網站服務器和應用程序掃描,還提供WordPress掃描。

•Angry IP Scanner另外,開源工具Angry IP Scanner不僅提供IP地址掃描,還提供端口掃描。使用該工具可以訪問主機名、NetBIOS、MAC地址和工作組信息等信息。

系統管理員最常用的5個Nmap命令基本掃描•Ping掃描——使用nmap-sp192.168.1.1/24顯示連接到網絡的全部設備。

•掃描單個主機——使用nmap scanme.nmap.org掃描一個主機,以掃描1000個密集使用的端口,這些端口被SQL、SMTP、apache等服務使用。

版本掃描在進行滲透測試時,IT團隊需要找出正在使用的應用程序版本,然後,他們可以搜索通用漏洞披露(CVE)數據庫中的現有漏洞,以查找服務的某個版本,進而測試網絡對它的響應。

使用'-sV'命令進行版本掃描:nmap-sV scanme.nmap.org。

進攻性掃描' -A '參數允許操作系統檢測、版本檢測、腳本掃描和跟踪路由。雖然進攻性掃描提供了比常規掃描了更好的信息,但它們發出的探針(probe)更多。對於系統管理員來說,安全審計期間更容易檢測到它們。要執行進攻性掃描,請使用nmap -A scanme.nmap.org。

掃描多個主機多主機掃描可以幫助那些管理大型網絡基礎設施的人。有四種方法可以使用這個選項:

•在一行中輸入所有的IP地址,以便一次性掃描所有主機:nmap192.164.1.1 192.164.0.2 192.164.0.2。

•輸入星號(*)表示一次性掃描所有子網:nmap192.164.1.*。

•不要鍵入整個域名,使用逗號分隔地址結尾:nmap192.164.0.1,2,3,4。

•輸入連字符表示IP地址範圍:nmap192.164.0.0—255。

端口掃描由於端口掃描是Nmap的主要功能之一,所以有不止一種方法來使用它:

•使用'-p'參數進行單端口掃描:nmap-p973 192.164.0.1。

•如果指定端口類型,Nmap允許你掃描查找關於特定類型連接的數據:Nmap-p T:7777, 973 192.164.0.1。

•如果你想掃描整個範圍的端口,用連字符區分它們:nmap-p76—973 192.164.0.1。

•使用'-top-ports'標誌來指定要掃描的前n個端口:nmap-top-ports10 scanme.nmap.org。

隨著聯網設備數量的不斷增加,對互聯網協議(IP) 地址的需求已經超過了互聯網協議版本4 (IPv4) 地址的供應,導致採用互聯網協議版本6 (IPv6) 來減少加載IPv4 地址。

在您的虛擬專用網絡(VPN) 服務中使用IPv6 可以幫助您實現更好的安全性、支持更多功能並訪問更大的地址空間。該協議可以讓您的解決方案面向未來,使其能夠在特定的5G 網絡中運行,並支持支持IPv6 的企業和專用網絡。

在本文中,我們在解釋了IPv4 和IPv6 協議之間的差異後展示瞭如何將IPv6 支持添加到應用程序VPN。在我們的示例中,即使我們無法直接訪問IPv6 網絡,我們也會通過網絡地址轉換64 (NAT64) 添加IPv6 支持,並解釋NAT64 在IPv6 中的作用。您可以在可能無法對網絡進行細粒度控制的受限環境中使用我們在此處介紹的方法。受限環境是指只有IPv6 或IPv4 網絡可用的環境。在這樣的環境中,不可能到達存在於不受支持的地址空間中的某些目標服務器。

虛擬專用網絡簡介VPN 技術允許多台計算機通過軟件定義的虛擬網絡在互聯網上安全、私密地連接。這些虛擬網絡的創建獨立於底層物理網絡基礎設施的物理拓撲。您可以通過以下步驟實現此目的:

通過物理網絡打包和中繼VPN 數據包的虛擬網絡接口之間的隧道流量

將整個過程抽象為VPN 客戶端

這是一個簡單的VPN 設置示例:

image.png

基本的VPN 設置

在此設置中,如果客戶端設備1 想要向客戶端設備2 發送數據,則會發生以下情況:

客戶端設備1 可以使用10.0.0.2 地址通過其VPN 接口向VPN 服務器發送數據包。

接口查詢其配置信息並確定數據包的下一個目的地。當接口必須將數據包發送到另一台物理主機時,作為VPN 服務器的網絡適配器的物理接口將連同標頭一起傳輸整個數據包。

這個新數據包包含物理網絡的路由信息。

目標主機收到新數據包,解包原來的VPN 數據包,並以同樣的方式繼續路由。

這是包裝後的數據包的樣子:

image.png

包裹的VPN 數據包

請注意,VPN 接口的軟件實現生成物理接口的數據包,允許它在VPN 數據包被路由之前執行其他操作。例如,物理接口的數據包可以加密整個有效載荷,這樣物理主機就無法訪問嵌套的VPN 數據包,這是一個封裝在另一個VPN 數據包中的數據包。

這種在路由數據包之前嵌套數據包的想法也可以應用於常規數據包。以下是這個想法在這種情況下的工作方式:

VPN 服務要求操作系統通過其虛擬接口路由數據包。

VPN 接口根據其配置文件路由數據包。

例如,VPN 接口可以將數據包發送到VPN 服務器,VPN 服務器解壓縮到達的數據包,將它們代理到原始目的地,然後將響應返回給VPN 客戶端。

大多數人在考慮VPN 的工作原理時都會想到這種情況。虛擬專用網絡允許對客戶端的出站流量進行加密和代理,以提供額外的安全級別並向客戶端的互聯網服務提供商(ISP) 隱藏信息。

VPN 是在通信協議、加密和身份驗證的幫助下實現的,這些協議有助於在Internet 上安全地加密和傳輸數據。在下一節中,我們將討論哪些通信協議對於實施VPN 解決方案至關重要。

IPv4 和IPv6 概述及其與VPN 的連接大多數VPN 實施在開放系統互連模型的網絡層上運行。根據這個模型,VPN 實現處理IP 數據包並處理它們的路由。這需要VPN 網絡接口背後的軟件來實現Internet 協議,也可能需要一些傳輸層協議。

網絡協議是一組規則,描述數據的結構以及對等方應如何處理它。互聯網協議是一種特定的網絡協議,可以使互聯網上的設備之間進行通信。使用VPN 時,您通常需要使用多種協議,例如Internet 協議或傳輸控制協議(TCP),這些協議有助於通過Internet 在設備之間進行安全通信。 VPN 中使用IPv4 和IPv6 在設備之間傳輸數據。此外,已實現的TCP 可以根據從網絡接收到的原始字節重建TCP 數據包,並創建符合TCP 規則的新TCP 數據包。

實現一個網絡通信協議通常包括以下步驟:

編寫用於創建和解析數據包的函數

實現一個狀態機,它根據處理過的數據包的內容而改變

傳送數據包的方法不是協議的一部分,可以在協議實現過程之外進行處理。

現在,讓我們仔細看看兩個特定的協議:IPv4 和IPv6。這些是主要的互聯網協議,其中IPv4 是最常用的,而IPv6 是最新的。

IPv6 與IPv4:有何區別? IPv4是目前世界上使用最廣泛的協議,儘管它不是Internet 協議的最新版本。 IPv4 地址是32 位數字,以十進製表示法表示為由點分隔的四組數字;例如,192.168.0.1。

IPv4 最多支持大約43 億個唯一地址,因為地址字段只有4 個字節(或32 位)長。 IPv6使用128 位地址並提供更大的地址空間。這是IPv6 相對於IPv4 的主要優勢。由於連接互聯網的設備數量早已超過40 億大關,IPv4 的地址空間已經完全耗盡。在IPv6 網絡中,可能的地址數量為2^128,或大約340 六十億,大約是43 億的79 萬億倍。通過IPv4 網絡傳輸IPv6 流量還有幾個重要的好處:

image.png

IPv6 與IPv4 相比的優勢

基本IPv6 標頭僅包含協議運行的最重要信息。如果對等方需要在標頭中攜帶額外信息,他們可以將各種可選標頭鏈接在一起。這種方法減少了協議最常見用例的開銷,例如從A 向B 發送數據包。

image.png

IPv4 與IPv6 標頭

現在您已經知道切換到IPv6 協議的主要好處,讓我們來看看如何在IPv4 基礎設施上路由IPv6 流量。

使用IPv6 提高VPN 安全性要介紹任何協議,您需要閱讀文檔並實現狀態機和處理特定於所選協議的數據包的功能。但在此步驟中,您可能還會遇到一些問題。讓我們看一下在VPN 服務中實現IPv6 支持的標準機制。

當您允許來自IPv4 的IPv6 流量時,您可以實現以下目標:

允許客戶端應用訪問IPv6 網絡上的服務器

支持純IPv6 環境中的網絡

實施IPv6 協議的過程很簡單。 VPN 服務從其由操作系統管理的虛擬網絡接口獲取所有客戶端數據。此數據包括實際的協議標頭,直到VPN 服務必須處理的IP 標頭。 VPN 服務還必須能夠根據從虛擬網絡接口接收到的信息構建響應數據包。

使用IPv6 協議,處理數據包相當簡單:

VPN 服務會存儲原始標頭,直到它從目標服務器獲取響應。

VPN 服務通過交換源地址和目標地址並更新與負載相關的字段來重用標頭來構造響應數據包。

新標頭添加到響應數據之前,並寫回虛擬接口供操作系統處理。

您還可以使用其他編程語言在您的應用程序中實現VPN 服務,例如C/C++、Java、Python 和Rust。在本文中,我們探索了VPN 服務的Kotlin實現。當您需要實施每應用VPN 時,Kotlin 有一些好處,它允許您為每個應用創建單獨的VPN 連接以隔離網絡流量:

image.png

假設我們的VPN 服務可以直接訪問虛擬網絡接口的文件描述符。該服務通過多個套接字轉發數據包的有效負載,將數據包代理到外部世界。套接字本身和相關的元數據存儲在會話抽像中。然後,數據包由SessionHandler類處理。

以下是SessionHandler類在處理數據包時所做的事情:

解析數據包

根據存儲在相應會話中的信息決定如何處理它們

轉發數據包的內容

處理響應

在將響應放回網絡接口之前為客戶端重新打包響應

image.png

由於虛擬網絡接口由文件描述符表示,因此從中接收數據包就像從常規文件中讀取數據一樣容易:

image.png

原始字節很難處理,尤其是當您需要將它們解釋和操作為複雜的數據結構(如協議標頭)時。在Kotlin 中,可以創建可以解釋原始字節並提供用於更改標頭字段的簡單接口的精簡包裝器。此類包裝器提供與標頭中每個字段相對應的函數,提供對它們的輕鬆讀寫訪問。

您還可以將所有這些函數轉換為具有自定義getter 和setter 的字段。在這種情況下,使用包裝器的客戶端代碼看起來就像在操作常規數據類。 IP 標頭的包裝器如下所示:

classIPWrapper(bytes:ByteArray){

//wrapthebytesintotheByteBufferclassforeasierbytemanipulationandextrafunctionality

//besuretoaccountfortheByteBuffer'sstatefulnessandspecifyindicesexplicitlywhenaccessing

//thebytes

privatevalbuffer=ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN)

//theIPversionisstoredinthefirst4bitsoftheheader

varipVersion

//togetit,readthefirstbyteandshiftitby4bitstotheright

get()=(buffer.get(0).toInt()shr4)

//andtosetit,shiftthedesiredvaluetotheleftby4bitsandperformthebitwiseshiftOR

//onthefirstbyteoftheunderlyingbytearray

set(value){buffer.put(0,((valueshl4)or(buffer.get(0).toInt()and0x0F)).toByte())}

//IPv4andIPv6headerscontaindifferentfields,soifclientcodeattemptstoaccessafieldthat

//isnotpresentintheunderlyingpacket,throwanexception

varheaderLength

get()=

//checktheipversionbycallingtheipVersionmemberdeclaredearlier

if(ipVersion==4)(buffer.get(0)and0x0F)

//IPv6headerdoesnothaveafieldfortheheaderlength,sothereisnovaluethisgettercanreturn

elsethrowException('IPv6doesn'thaveaHeaderLengthfield!')

set(value){

//similarly,ifthefieldisthere,setit

if(ipVersion==4)buffer.put(0,((valueand0x0F)or(buffer.get(0).toInt()and0xF0)).toByte())

//ifit'snot,throwanexception

elsethrowException('IPv6doesn'thaveaHeaderLengthfield!')

}

//IPheaderscanbeofdifferentversions,andit'sconvenienttohaveasinglewrapperclass

//forbothIPv4andIPv6

varsrcIp

get()=InetAddress.getByAddress(run{

val(startPos,len)=

if(ipVersion==4)listOf(SOURCE_IP_POS_IPV4,ADDR_LEN_IPV4)

elselistOf(SOURCE_IP_POS_IPV6,ADDR_LEN_IPV6)

//whengettingtheIPaddress,simplycopythebytesthatrepresentitandpasstheresult

//intoJava'sInetAddress.getByAddressfunctionthatwilldotherestoftheparsing

buffer.array().copyOfRange(startPos,startPos+len)

})

set(value){

value.address.copyInto(

buffer.array(),

if(ipVersion==4)SOURCE_IP_POS_IPV4

elseSOURCE_IP_POS_IPV6

)

}

//dothesameforthedestinationaddress

vardestIp

get()=/*.*/

set(value)=/*.*/

//otherfieldscanbeimplementedinasimilarfashion

/*.*/

//thiswrappercanalsohavevariousconveniencefunctions;forexample,itcanprovide

//meansforeasilygettingthewrappedpacket'sheaderstoquicklycreateresponseheaders

funcopyHeaders()=/*.*/

//orhandlethechecksumcomputationsfortheIPandthenestedtransportheaders

funupdateChecksums()=/*.*/

}一旦SessionHandler 類收到數據包,它就可以將數據包字節放入IPWrapper對象並使用IPWrapper 類從IP 標頭訪問它需要的任何信息。例如,在創建響應數據包時,SessionHandler類可以簡單地複制標頭並更新字段,而不是創建一個全新的標頭:

image.png

您可以將生成的響應數據包寫回VPN 的網絡接口:

image.png

一旦SessionHandler 類將數據包的字節放入IPWrapper 類,路由軟件將解析VPN 服務生成的IP 標頭並將數據包路由到其目的地。在這種情況下,目標是本地應用程序,其出站流量已通過操作系統的路由規則重定向到VPN 的網絡接口。

現在,讓我們看看如果您只能訪問IPv4 網絡,如何檢查支持IPv6 的VPN。

使用NAT64 測試IPv6 實現雖然實施協議相對簡單,但測試才是真正挑戰的開始。那麼,NAT64、IPv4、IPv6是如何相互連接的呢?

IPv6 明顯優於IPv4,但支持IPv6 的基礎設施尚不存在。世界上許多ISP 仍然不支持IPv6,因此他們無法將IPv6 轉換為IPv4,反之亦然。因此,他們的客戶端無法訪問任何使用IPv6 的服務器。相反的情況也存在:有些網絡僅使用IPv6 運行,不處理IPv4 數據包。

要解決這些不兼容問題,您可以使用以下轉換機制之一:

image.png

IPv6 過渡機制

對於下面描述的方法,我們使用了NAT64——一種將所有40 億個IPv4 地址映射到IPv6 地址空間的保留塊的轉換機制。我們的客戶特別要求使用NAT64 在IPv4 地址和IPv6 地址之間進行轉換。

讓我們看看這種機制在實踐中是如何工作的,以及NAT64 為IPv6 做了什麼。假設連接使用不同IP 版本的網絡的路由器收到一個IPv6 數據包,其目標地址來自NAT64 地址範圍。這是接下來發生的事情:

路由器從收到的IPv6 數據包中刪除96 位長的NAT64 前綴,留下32 位的IPv4 地址。

之後,路由器為數據包創建一個新的IPv4 標頭,以便它可以繼續在網絡中傳輸。

當路由器收到IPv4 數據包並必須通過IPv6 網絡路由它時,也會發生同樣的情況:

路由器通過添加NAT64 前綴將IPv4 地址轉換為IPv6 地址。

路由器為數據包重新創建IP 標頭,然後通過IPv6 網絡路由數據包。

您可以使用這些轉換機制來測試IPv6 實現,尤其是在IPv6 網絡不可用的地方。要查看您的VPN 服務如何在純IPv4 環境中處理IPv6 數據包,請在您服務的VPN 接口上使用NAT64 範圍內的目標地址打開IPv6 套接字:

image.png

套接字傳輸

如果您的VPN 服務正常運行,它將接收這些數據包並像處理常規IPv6 數據包一樣處理它們。當這些數據包最終通過物理網絡接口進行路由時,它們將到達一個路由器,該路由器會將它們轉換為常規的IPv4 數據包。然後,您的VPN 服務將能夠從目標服務接收響應數據,為客戶端創建響應IPv6 數據包,並通過其虛擬接口發送。

結論雖然IPv4 仍然更受歡迎,但IPv6 為用戶和開發人員提供了更多好處。在本文中,我們解釋了為什麼需要在您的應用程序中將IPv4 轉換為IPv6,以及如何將對NAT64 的支持添加到您的應用程序中。在您無法完全控製網絡的受限環境中,也允許使用NAT64 將IPv6 地址映射到IPv4 目標。

4. 管理防火牆中的外部連接macOS 具有內置防火牆,可以保護應用程序免受未經授權的互聯網訪問。它有助於阻止任何傳入連接並允許訪問您想要的應用程序。

要配置防火牆,請訪問“安全和隱私”首選項窗格中的“防火牆”選項卡:

image.png

圖21. 訪問防火牆配置

然後,單擊“防火牆選項”以配置防火牆。您可以阻止所有傳入連接,以禁止任何人或任何事物連接到macOS。這是最安全的防火牆配置,但某些應用程序在啟用後可能無法提供在線功能。

image.png

圖22. 使用防火牆阻止所有連接

您還可以選擇允許特定應用程序的傳入連接。如果您正在測試客戶端-服務器應用程序並且發現客戶端-服務器連接有任何問題,請檢查防火牆配置並嘗試將您的應用程序添加到允許列表中。

image.png

圖23. 允許通過防火牆進行特定的互聯網連接

5. 指定應用程序的隱私訪問權限某些應用程序需要訪問高級macOS 功能才能正常工作。但惡意應用程序也可能請求訪問這些功能以竊取用戶的個人數據。默認情況下,macOS 會阻止對位置服務、聯繫人、照片、麥克風、設備磁盤、屏幕錄製、藍牙和其他功能的訪問,以保護用戶免受安全威脅。

如果用戶安裝的應用程序請求訪問被阻止的功能,則用戶必須在“安全和隱私”首選項窗格的“隱私”選項卡中提供訪問權限。

image.png

圖24. 為應用程序提供對位置服務的訪問權限

當開發需要訪問敏感功能和資源的應用程序時,請確保在安裝程序中包含訪問請求。該請求可能如下所示:Please grant

6. 配置鑰匙串訪問Keychain Access 是用於密碼管理的默認macOS 應用程序,可存儲用戶的憑據,從而減少用戶必須記住的密碼數量。您可以在應用程序列表的實用程序文件夾中找到鑰匙串訪問。打開它以查找並配置任何存儲的憑據。

image.png

圖25. 訪問Keychain Access 中存儲的憑據

為了保護憑據,此應用程序使用傳輸層安全(TLS)協議和公鑰證書。讓我們來看看它們是如何工作的。

TLS 是一種加密協議,旨在保護計算機網絡中的通信。它廣泛用於使用HTTPS 的應用程序,例如電子郵件、即時消息和IP 語音。

公鑰證書包含有關公鑰、其所有者以及已驗證證書內容的實體的數字簽名的信息。如果簽名有效並且檢查證書的軟件信任頒發者,則它可以使用該密鑰與證書主體進行安全通信。

在電子郵件加密、代碼簽名和電子簽名系統中,證書的主體通常是個人或組織。在TLS 中,證書的主體通常是計算機或其他設備,儘管TLS 證書除了識別設備的核心角色之外還可以識別組織或個人。

如果您嘗試訪問任何受保護的資源,則其證書需要受到macOS 的信任。默認情況下,macOS 有一個受信任的證書列表。如果您想訪問沒有受信任證書的資源,您將看到以下消息:

image.png

圖26. 嘗試訪問沒有受信任證書的資源

只有具有相應憑據的管理員才能將資源添加到鑰匙串訪問。單擊“顯示詳細信息”,然後單擊“訪問網站”以將證書添加到“鑰匙串訪問”。

image.png

圖27. 將資源添加到鑰匙串訪問

之後,您可以打開證書詳細信息並更改證書的設置。

image.png

圖28. 配置證書設置

在開發和測試客戶端-服務器macOS 應用程序時,您需要了解如何使用鑰匙串訪問並管理其中的安全證書。如果您的應用程序在安裝過程中創建了證書,請確保執行以下操作:

當您的應用程序請求管理員訪問權限時,為您的應用程序提供所有權限,然後檢查“鑰匙串訪問”內的證書。

不提供證書安裝的管理員權限,或者不使連接受信任。檢查應用程序安裝過程和應用程序行為。您的應用程序應顯示有關證書問題的通知。此外,它還應該將有關這些問題的信息添加到應用程序日誌中。但是,它不應該崩潰。

當您將應用程序的證書設為不可信或完全刪除該證書時,請檢查應用程序的行為。

通過將macOS 中的日期更改為任何未來日期,使應用程序證書過期。檢查應用程序在這種情況下的行為方式。

請記住,鑰匙串訪問功能在不同的macOS 版本中會發生變化。例如,在macOS 10.15 及更早版本中,您可以通過以超級用戶身份執行以下腳本來使證書受信任:

image.png

在更高版本的macOS 中,您無法執行此操作。此外,在macOS 11 和12 中,即使用戶運行終端命令以使證書受信任,也需要手動批准應用程序證書。這樣做是出於安全原因:未經用戶許可,腳本無法使任何證書受信任。在這些版本的macOS 中,請使用終端命令檢查UI 和靜默安裝選項,因為您可能會在macOS 11 及更高版本上遇到靜默安裝問題。

7. 啟用遠程登錄遠程訪問macOS 允許開發人員重現並修復用戶遇到的問題。操作系統默認提供了訪問遠程系統的功能,因此您無需安裝第三方軟件。

默認情況下,所有遠程訪問功能均處於禁用狀態,但您可以在共享首選項中配置它們。啟用遠程登錄將向您顯示一條消息:

image.png

圖29. 啟用對系統的遠程訪問

使用此命令和您的密碼可以訪問其他用戶的系統。

您還可以在屏幕共享中啟用虛擬網絡計算(VNC) 訪問,這將允許您共享屏幕。當您啟用此功能時,您將看到類似的消息:

image.png

圖30. 通過VNC 服務啟用遠程訪問

請注意,要啟動屏幕共享,您需要打開計算機設置並設置用於訪問系統的密碼。

您可以在遠程管理服務中啟用Apple 遠程桌面。它使您能夠遠程執行任何腳本並使用所有終端功能。您可以從任何操作系統通過Apple Remote Desktop 連接到另一台設備。 Apple 遠程桌面是在互聯網連接速度較慢時建立遠程連接的最佳方式,因為它不加載macOS GUI。

VNC 服務為您提供與macOS GUI 的遠程連接。作為開發人員或QA 工程師,您可以使用VNC 在另一台具有不同macOS 版本的Mac 設備上測試您的應用程序。您還可以連接到最終用戶的macOS 設備並調試應用程序的任何問題。

image.png

圖31. 啟用Apple 遠程桌面

8. 獲取超級用戶訪問權限Root 是超級用戶,可以無限制地訪問所有系統功能和文件。當管理員帳戶無法提供所需的權限級別時,此用戶會很有幫助。例如,管理員無法更改系統文件,但超級用戶可以。您可以通過終端和GUI 獲取root 訪問權限。讓我們看一下終端選項。

當您運行命令並看到“權限被拒絕”消息時,請運行相同的命令,並在其前面加上sudo 一詞。您需要輸入root 密碼,然後命令將被執行而不會出現訪問問題。

要成為終端內的超級用戶而無需在每個命令前輸入sudo,請使用sudo su 命令。您還需要輸入root 密碼。執行此命令後,您將在此終端會話中獲得超級用戶訪問權限。

要通過GUI 獲得超級用戶訪問權限,您需要成為管理員。默認情況下無法以超級用戶身份登錄macOS,但有一個解決方法。在“用戶和組”首選項窗格中打開“登錄選項”,然後單擊“加入”。

image.png

圖32. 更改macOS 中的登錄選項

在打開的表單中,選擇“打開目錄實用程序”,然後單擊左下角的鎖定圖標並輸入管理員憑據。

image.png

圖33. 登錄目錄實用程序

在“目錄實用程序”中,打開“編輯”菜單,選擇“啟用Root 用戶”,然後為root 用戶設置密碼。

image.png

圖34. 通過macOS GUI 啟用root 用戶

現在您可以以root 用戶身份登錄和退出macOS。在登錄屏幕上,選擇“其他”,輸入“root”作為用戶名,然後輸入您為root 帳戶創建的密碼。

image.png

圖35. 登錄root 帳戶

如果您的應用程序具有需要root 訪問權限才能工作的功能,請檢查在用戶沒有root 訪問權限時這些功能的執行情況。理想情況下,在這種情況下,應用程序應顯示有關權限問題的消息,將此信息添加到其日誌中,並繼續工作而不會崩潰。

結論macOS 具有一組強大的內置安全功能,macOS 開發人員需要了解這些功能並正確配置以保護其係統和應用程序。此外,Apple 經常重新設計和改進這些安全功能,因此在新的macOS 版本中,您需要確保您的軟件能夠在最新版本中正常運行。

在處理macOS 相關項目時,您的開發和質量保證(QA) 團隊必須考慮許多細微差別以交付安全的應用程序。例如,您需要確保您的應用程序適用於所有可能的macOS 安全配置。您必須了解這些功能在特定版本的macOS 中如何工作、管理員如何配置它們,以及如何通過各種macOS 安全配置確保解決方案的穩定性能。

在本文中,我們概述了八個關鍵的macOS 安全配置,展示瞭如何使用它們來保護macOS 設備,並解釋了開發安全的macOS 應用程序時應考慮的事項。

本文對於從事macOS 開發項目、希望更深入地了解macOS 安全功能的IT 工程師非常有用。

1. 設置用戶帳戶在macOS 中,您可以選擇具有不同權限級別的四種類型的用戶帳戶。這些權限可以允許或阻止使用不同操作系統功能的能力。

在macOS 中,您可以創建以下帳戶類型:

行政。管理員擁有所有可能的訪問權限。他們可以更改任何macOS 配置、安裝和刪除應用程序、創建和管理用戶帳戶等。您在macOS 中創建的第一個用戶將屬於管理員類型。一台設備上可以有多個管理員。

標準。標準用戶可以管理自己的設置、使用主文件夾中的文件和文件夾以及下載系統更新但不能安裝它們。標準用戶無法安裝和刪除應用程序、更改其他用戶的配置文件或編輯系統首選項(例如網絡和安全首選項窗格中的首選項)。您可以將標準用戶帳戶升級為管理員帳戶。

僅供分享。僅共享帳戶的用戶唯一可以做的就是遠程訪問共享文件。他們無法登錄macOS 中的個人用戶配置文件。

客人。每個系統只有一個訪客用戶帳戶,無需密碼即可登錄。訪客無法更改任何設備或操作系統設置、管理用戶或遠程登錄。當訪客註銷時,他們創建的所有數據都將被刪除。

要管理用戶,請以管理員身份打開“系統偏好設置”中的“用戶和組”偏好設置窗格。您將看到用戶列表及其帳戶類型。如果您想更改用戶帳戶,請單擊鎖定圖標並輸入管理員密碼:

image.png

圖1. 訪問“用戶和組”首選項窗格

要將標準用戶升級為管理員,請選中“允許用戶管理此計算機”選項。您可以通過取消選中此框將管理員用戶降級為標準用戶。

image.png

圖2. 將標準用戶帳戶升級為管理員帳戶

單擊訪客用戶管理設備的訪客帳戶:

image.png

圖3. 在macOS 中管理來賓用戶帳戶

要創建新用戶,請單擊“用戶和組”首選項窗格左下角的加號按鈕,然後填寫帳戶創建表單:

image.png

圖4. 創建新用戶帳戶

如果要刪除用戶帳戶,請選擇要刪除的帳戶,單擊“用戶和組”窗格左下角的減號按鈕,然後確認要刪除該帳戶:

image.png

圖5. 刪除用戶帳戶

根據用戶角色和需求配置用戶帳戶通常有助於提高網絡和應用程序的安全性,但在以下情況下應特別注意帳戶創建:

該設備可供多人使用。如果許多人都可以訪問存儲敏感信息的系統,您需要保護它免受未經授權的訪問和內部威脅。實現此目的的一種方法是創建具有所需訪問級別的不同用戶帳戶。例如,您可以允許用戶讀取數據並查看系統設置,但只允許系統管理員更改數據和設置。

組織擁有該設備。當組織為員工提供工作計算機時,它可能會限制用戶訪問設備設置的權限並使用組策略控制此類設備。 macOS 允許管理員通過創建具有訪問限制的用戶帳戶來執行此操作。

該設備有多種使用場景。用戶可以使用同一台計算機執行多種任務:編寫代碼、創建內容、觀看電影等。為每項任務創建單獨的用戶帳戶可以幫助根據特定的使用場景自定義設備和應用程序設置。

多種類型的用戶帳戶意味著開發人員必須測試其應用程序如何與所有帳戶配合使用。 QA 團隊應驗證具有不同訪問權限的應用程序的安裝、執行和卸載。

假設您的應用程序中有一項功能僅適用於管理員權限。要檢查此功能的工作原理,您需要首先使用管理員配置文件進行測試。然後,以標準用戶身份運行相同的功能,並且不授予應用程序所需的權限。在這種情況下,該功能將不起作用,但應用程序應該可以繼續順利運行。此外,在這種情況下,應用程序可能會顯示特殊通知,例如feature 需要管理員訪問權限。

QA 工程師應將有關此類訪問請求的信息添加到應用程序日誌中,以幫助開發團隊定位可能出現的任何問題。

2.限制屏幕時間macOS 管理員可以通過配置屏幕時間限制來限制用戶對某些應用程序的訪問。此功能允許配置計算機停機時間、應用程序限制以及內容和隱私限制。開發應用程序時,請確保您了解此功能的工作原理以及您的應用程序在屏幕時間限制下應如何運行。

您可以通過登錄新帳戶並在“系統偏好設置”中打開“屏幕時間”窗格來限制用戶屏幕時間。然後,選擇選項並打開該功能。下一步是啟用“使用屏幕時間密碼”。時間密碼是忽略屏幕時間限製或更改屏幕時間設置所需的四位數代碼。

image.png

圖6. 為用戶啟用屏幕時間限制

通過屏幕時間限制,您還可以定義哪些應用程序在特定時間段內可用。進入“停機時間”選項卡可設置系統停機時間、開啟功能並設置計劃。

image.png

圖7. 配置系統停機時間

然後,轉到“應用程序限制”首選項窗格來設置應用程序的每日時間限制。選擇一個應用程序並設置限制。當超過限制時,應用程序將被阻止。

image.png

圖8. 配置應用程序停機時間

您可以在“始終允許”選項卡中選擇在停機期間不應阻止的應用程序。

image.png

圖9. 選擇不應阻止的應用程序

此功能還允許您阻止露骨和成人內容,並為帳戶設置隱私設置。您可以在“內容和隱私”首選項窗格中執行此操作。

image.png

圖10. 配置帳戶隱私設置

如果用戶嘗試訪問被阻止的網站,他們會看到一條警告消息。僅當他們知道屏幕時間密碼時,他們才能將此網站添加到批准列表中。

當您為應用程序配置屏幕時間限制並且這些限制處於活動狀態時,用戶將看到一個陰影圖標。

image.png

圖11. 具有活動屏幕時間限制的應用程序的圖標帶有陰影

當用戶嘗試啟動被阻止的應用程序時,他們會看到有關達到時間限制的警告。此時,他們可以再獲得一分鐘的時間來完成任務,或者輸入“屏幕時間”密碼來解鎖應用程序。

macOS 應用程序開發人員在開發產品時還必須注意屏幕時間阻塞。特別是,請務必檢查:

屏幕時間可以停止您的應用程序,而不會出現任何崩潰或致命錯誤

如果用戶請求再延長一分鐘或輸入屏幕時間密碼,則可以繼續使用您的應用程序

當應用程序在停機後解除阻止時,用戶可以使用該應用程序

應用程序的計劃進程和後台進程按屏幕時間限制按預期工作

屏幕時間的內容和隱私設置中有很多不同的限制。確保檢查它們不會使您的應用程序崩潰。例如,如果您正在開發可以阻止成人網站的網絡流量過濾器,請通過內容和隱私限制對此類網站的訪問,並檢查您的應用程序的工作方式。如果您正在開發視頻內容應用程序,請限制對成人電視節目的訪問,然後嘗試在應用程序內觀看它們。如果您正在開發視頻遊戲,您可以限制對在線遊戲的訪問並嘗試在線玩。

3.使用Gatekeeper檢查開發者IDGatekeeper 是一項保護macOS 免受不受信任應用程序侵害的功能。 macOS 用戶可以在系統偏好設置的安全和隱私部分中將其係統配置為允許或阻止來源未知和可疑的應用程序的執行。

圖12. 為應用程序配置可信源

用戶可以允許其設備僅使用從App Store 下載的應用程序。它是最值得信賴的下載來源,因為Apple 會在應用程序在App Store 上發布之前對其安全性進行審查。如果應用程序有任何問題,Apple 會將其從商店中刪除。

如果用戶嘗試打開不是從App Store 下載的應用程序,他們將看到以下消息:

image.png

圖13. 嘗試啟動從不受信任的來源下載的應用程序

還有一個選項允許從App Store 和指定的開發人員啟動應用程序。在這種情況下,macOS 將檢查應用程序的開發者ID 和公證,以確保其安全。當應用程序安裝時以及每次啟動時,Gatekeeper 都會檢查證書。

如果證書無效,則無法安裝應用程序。如果已安裝的應用程序是在證書有效時編譯的,則用戶可以執行該應用程序,即使證書已過期。如果開發者ID 配置文件已過期,則無法執行應用程序。

這就是為什麼每個應用程序都應該使用開發者ID 證書進行簽名。要獲得此類證書,您必須得到Apple 的認可並成為Apple 開發者計劃的一部分。開發者ID 證書自創建之日起五年內有效,因此請務必定期更新您的開發者ID。

任何應用程序還應該經過公證才能受到macOS 的信任。 Apple 公證服務是一個自動化流程,可掃描應用程序中是否存在惡意內容。如果沒有發現問題,它會允許macOS 運行該應用程序。為了檢查公證權限,Gatekeeper 連接到Apple 數據庫並蒐索該應用程序。

如果設備允許用戶運行從已識別的開發人員處下載的應用程序,Gatekeeper 仍會顯示一條警告消息,並附有註釋,說明Apple 檢查了該設備是否存在惡意軟件,但未檢測到任何惡意軟件,並且它將允許用戶打開該應用程序。

image.png

圖14. 啟動經過Apple 驗證的第三方應用程序

如果用戶嘗試運行不受信任的應用程序,他們將看到以下消息:

image.png

圖15. 啟動不受信任的應用程序

管理員可以通過在“安全和隱私”首選項窗格中設置相應的權限來允許用戶運行不受信任的應用程序。

image.png

圖16. 允許來自不受信任來源的應用程序

當您需要測試尚未受信任的應用程序並且您不想更改安全首選項時,Gatekeeper 可能會很麻煩。您可以使用以下命令忽略Gatekeeper 安全功能:

image.png

spctl 是一個可用於與Gatekeeper 通信的應用程序。它將Anywhere選項添加到安全和隱私設置中。這意味著您將能夠執行任何應用程序。

image.png

圖17. 允許安裝任何來源的應用程序

注意:我們強烈建議您不要禁用任何安全功能,除非您確定自己在做什麼!

您可以使用以下命令驗證應用程序的開發者ID 和公證:

image.png

如果您的應用程序由有效的開發者ID 簽名並具有有效的公證,則該命令將返回消息經過公證的開發者ID和開發者的信息。例如,讓我們檢查Google Chrome 應用程序:

image.png

圖18. 檢查Google Chrome 的開發者ID 和公證

如您所見,Google Chrome 受到macOS 的信任。

如果您感興趣的應用程序是由受信任的開發人員創建的,但未經公證,您將不會在源字段中看到“已公證”一詞:

image.png

圖19. 檢查未公證應用程序的開發者ID 和公證

如果應用程序甚至沒有開發人員ID 簽名,您將看到一條無可用簽名消息:

image.png

圖20. 在沒有可信開發人員簽名的情況下檢查應用程序

在交付任何macOS 產品之前,請使用上面列出的命令檢查應用程序的開發者ID 和公證。它將幫助您的最終用戶避免啟動應用程序時可能出現的問題。您還可以從任何互聯網資源下載應用程序的安裝程序並安裝它以模擬用戶體驗。

在下篇文章中,我們將介紹管理防火牆中的外部連接、指定應用程序的隱私訪問權限、配置鑰匙串訪問等問題。

確保軟件產品的安全性和可靠性是現代企業面臨的最大挑戰之一。隨著產品的發展,每個新功能都會為潛在的安全漏洞和性能瓶頸打開大門。

動態分析和逆向工程是允許開發人員在應用程序運行時探索其內部工作原理的兩種方法。借助這些見解,開發人員可以識別漏洞並發現潛在的安全問題。

在本文中,您將學習如何使用Frida 動態分析您的應用程序並發現漏洞。我們將根據我們自己的項目經驗向您展示Frida 工具的實際應用示例。本文對於想要確保其產品受到保護的安全研究人員、CTO 和CSO 非常有用。

什麼是動態分析以及為什麼它很重要?動態分析和逆向工程是企業增強產品安全性的兩種重要網絡安全方法。

動態分析允許網絡安全專家評估軟件運行時的行為。這對於:

漏洞檢測——發現潛在漏洞併計劃網絡安全增強,以保護您的產品免受數據洩露

真實世界模擬— 了解您的產品在現實條件下的表現,使您能夠從用戶的角度檢查您的產品,並了解它如何處理敏感數據和關鍵操作

性能優化——除了安全性之外,動態分析還有助於優化應用程序性能,從而幫助您改善產品的用戶體驗並優化基礎設施成本

合規保證——在潛在的違規行為導致合規違規和處罰之前識別它們

動態分析用於逆向工程,即使沒有源代碼或文檔,開發人員也可以剖析軟件並了解其內部工作原理。

在Apriorit,我們專注於逆向工程,並利用它來幫助企業評估和提高其軟件的安全性。這包括保護其免受可能導致重大聲譽和金錢損失的違規、惡意軟件攻擊和數據洩露。

有許多工具可以讓企業進行動態分析和逆向工程。在我們的逆向項目中,我們經常使用Frida。

Frida是什麼? Frida是一個動態開源檢測工具包,允許開發人員和逆向工程師將JavaScript 代碼注入正在運行的應用程序中。注入使開發人員能夠實時跟踪函數調用、修改函數行為和攔截數據,使其成為動態分析的寶貴工具。

Frida 提供了一套全面的API,可用於與正在運行的應用程序進行交互。

image.png

Frida 的體系結構基於客戶端-服務器模型。 Frida 服務器在目標設備或計算機上運行,而客戶端用於與服務器交互並將JavaScript 代碼注入正在運行的應用程序中。

讓我們看幾個示例,了解您可以使用Frida 執行哪些動態應用程序分析任務。我們將從桌面應用程序開始。

使用Frida 對桌面應用程序進行動態分析Frida 支持Windows、macOS 和Linux,使其成為分析桌面應用程序的可靠選擇,無論它們運行在何種操作系統上。讓我們看看您可以使用Frida 執行的一些任務。

在執行任何動態分析或操作操作之前,我們需要將Frida 注入到我們的桌面應用程序中。這是一個相對簡單的過程:

在目標系統上安裝Frida。

使用命令frida-server -l 0.0.0.0.這將啟動Frida 服務器並使其可供網絡上的其他設備訪問。

將Frida 客戶端附加到目標進程並註入Frida 腳本。

在Windows 桌面應用程序中掛鉤MessageBox為了演示如何使用Frida 掛鉤函數,讓我們考慮在Windows 桌面應用程序中掛鉤MessageBox函數的示例。該函數用於向用戶顯示消息框,使其成為動態分析的絕佳目標。

要使用Frida 掛鉤MessageBox函數,我們首先需要編寫一個Frida 腳本。該腳本將附加到目標進程,找到MessageBox 函數的地址,並使用攔截器掛鉤該函數。這是我們的一個項目中的自定義腳本:

image.png

在此腳本中,我們使用Module.findBaseAddress查找user32.dll 庫的基地址,其中包含MessageBox函數。然後,我們使用findExportByName方法獲取MessageBox函數的地址(對於私有方法,我們可以使用帶有偏移量的add)。最後,我們使用Interceptor.attach來掛鉤MessageBox函數,在調用該函數時將消息記錄到控制台。

要運行此腳本,請將其保存到文件(例如hook_messagebox.js)並使用以下命令運行Frida 客戶端:

image.png

這會將Frida 連接到目標進程並註入腳本。當目標進程調用MessageBox函數時,Frida將攔截該函數並將消息記錄到控制台。

在macOS 桌面應用程序中修改NSURLRequestFrida 在桌面應用程序中的另一個強大功能是實時修改數據。例如,讓我們考慮使用NSURLRequest發出HTTP 請求的macOS 桌面應用程序的情況。我們可以使用Frida 在發送HTTP 請求之前對其進行修改,從而使我們能夠繞過安全措施或修改應用程序的行為。

要使用Frida 修改macOS 桌面應用程序中的NSURLRequest,我們首先需要編寫一個Frida 腳本。該腳本將附加到目標進程,查找NSURLRequest對象的地址,並使用JavaScript 修改其屬性。這是一個例子:

functionmodify_nsurlrequest(){

//FindtheaddressoftheNSURLRequestobject

varrequestPtr=null;

varobjc_msgSend=newNativeFunction(Module.findExportByName('libobjc.A.dylib','objc_msgSend'),'pointer',['pointer','pointer']);

Interceptor.attach(objc_msgSend,{

onEnter:function(args){

varsel=ObjC.selectorAsString(args[1]);

if(sel==='initWithURL:cachePolicy:timeoutInterval:'){

requestPtr=args[0];

}

},

onLeave:function(retval){

if(requestPtr!==null){

varrequest=newObjC.Object(requestPtr);

request.setValue_forHTTPHeaderField_('my-custom-header','X-Custom-Header');

requestPtr=null;

}

}

});

}

//Attachtothetargetprocessandwaitforittostart

Process.enumerateApplications({

onMatch:function(info){

if(info.name==='TargetApp'){

console.log('Attachingto'+info.name+'('+info.pid+')');

//Attachtotheprocessandwaitforitsmainmoduletobeloaded

Process.attach(info.pid,{

onModuleLoaded:function(module){

if(module.name==='TargetApp'){

//Waitforthescriptruntimetobeready

setTimeout(modify_nsurlrequest,0);

}

}

});

}

},

onComplete:function(){

console.log('Failedtofindtargetprocess');

}

});該腳本使用objc_msgSend函數攔截對NSURLRequest類的initWithURL:cachePolicy:timeoutInterval:方法的調用。當調用這個方法時,我們保存初始化的NSURLRequest對象的地址。當該方法返回時,我們創建一個代表NSURLRequest對象的ObjC.Object實例,並根據需要修改其屬性。

接下來,我們使用Process.enumerateApplications按名稱查找目標進程。找到進程後,我們使用Process.attach附加到它並等待其主模塊加載。當主模塊加載時,我們調用setTimeout函數來安排在下一次事件循環迭代期間對修改_nsurlrequest函數的調用,從而為腳本運行時提供完全初始化的機會。

一旦調用了modify_nsurlrequest函數,它將攔截對NSURLRequest初始化方法的調用,並根據需要修改任何初始化的NSURLRequest對象的屬性。

這些只是您可以在桌面應用程序中使用Frida 執行的動態分析任務的幾個示例。現在讓我們看一下Frida 在移動應用程序中的用途。

使用Frida 對移動應用程序進行動態分析動態分析是識別移動應用程序中漏洞的有效方法,因為它使我們能夠實時監控應用程序行為。

Frida 可用於對Android 和iOS 應用程序執行動態分析。借助Frida,我們可以連接正在運行的應用程序並監視其行為,包括函數調用、網絡流量和內存使用。

要使用Frida對應用程序進行動態分析,我們首先需要將應用程序安裝在物理或虛擬設備上。然後,我們可以將Frida 附加到正在運行的進程並開始監視應用程序的行為。

Frida 可用於未root、已root 和越獄的設備。 Frida 官方文檔中詳細描述了安裝。通常,它涉及在目標設備上運行run frida-server 命令並在調試模式下使用USB 連接到目標設備。

讓我們看一些示例,了解如何使用Frida 在移動應用程序上運行動態分析。

繞過根檢測許多開發人員實施root 檢測以防止用戶在root 設備上運行其應用程序。然而,使用Frida 的動態分析可以繞過這個問題。

讓我們看一個使用Frida 繞過Android 應用程序中的root 檢測的示例。在這種情況下,我們假設應用程序正在使用SafetyNet API 來檢查設備是否已獲得root 權限。

為了繞過root 檢測,我們將使用Frida 攔截對SafetyNet API 的調用並修改返回值以指示設備未獲得root 權限。下面是實現此目的的JavaScript 代碼:

image.png

然而,現代移動應用程序和系統通常採用多層安全措施來檢測和防止各種形式的篡改和未經授權的訪問。因此,繞過當代應用程序和系統中的根檢測可能需要更廣泛和復雜的掛鉤技術。

您可以在CodeShare上找到這些技術和實施示例。

篡改API 調用移動應用程序通常使用API 與後端服務器進行通信。通過篡改API 調用,攻擊者可以修改應用程序行為或竊取敏感數據。

我們將在Frida 動態儀器中合乎道德地使用這項技術。篡改API 調用可以幫助您評估應用程序的整體安全性、檢查流量和監控行為。

Frida 允許篡改iOS 應用程序中的API 調用。在本例中,我們假設應用程序正在使用URLSession API 向後端服務器發出請求。

為了篡改API 調用,我們將使用Frida 攔截對URLSession API 的調用並在請求發送到服務器之前修改請求。這是實現此目的的代碼:

image.png

通過篡改API調用,您可以評估應用程序的安全漏洞。在Apriorit,我們使用這種方法來模擬各種攻擊場景,並識別應用程序處理數據、與服務器通信或響應意外輸入的方式中的潛在弱點。

與Frida 進行逆向工程您可以使用Frida 進行逆向工程。它提供了一個動態分析環境,可幫助您檢查應用程序在運行時的行為方式。 Frida 允許我們掛鉤應用程序的執行流程,監視和操作函數調用和參數,並攔截應用程序發送或接收的數據。

在Apriorit,我們使用Frida 執行各種逆向工程任務,例如:

提取加密密鑰

分析網絡流量

跟踪系統調用

識別惡意軟件行為

研究專有協議

分析二進制代碼

還有其他活動,例如使用Frida 進行惡意軟件檢測,允許網絡安全專家對惡意軟件進行逆向工程。

在本指南中,我們使用Android 應用程序作為示例演示前三個任務。 Frida 特別適合Android 平台,而其他工具可能更適合桌面和iOS 平台上的逆向工程任務。

提取加密密鑰Apriorit 安全專家團隊使用Frida 提取應用程序使用的加密密鑰來保護敏感數據。通過連接應用程序的加密函數,我們可以攔截應用程序生成或使用的密鑰並記錄它們以供進一步分析。

以下是使用Frida 從應用程序中提取加密密鑰的腳本示例:

image.png

該腳本掛鉤javax.crypto.KeyGenerator和javax.crypto.Cipher類並攔截它們的函數調用。當KeyGenerator初始化新密鑰時,腳本會記錄密鑰大小並生成密鑰。當使用密鑰初始化Cipher時,腳本會記錄有關密鑰的信息。

分析網絡流量Frida 可用於通過連接網絡功能並攔截應用程序發送或接收的數據來分析應用程序的網絡流量。這對於識別通過網絡傳輸的敏感數據以及了解應用程序如何與外部服務進行通信非常有用。

下面是一個使用Frida 攔截網絡流量的示例腳本:

Java.perform(function(){

varURL=Java.use('java.net.URL');

varHttpURLConnection=Java.use('java.net.HttpURLConnection');

varOutputStreamWriter=Java.use('java.io.OutputStreamWriter');

varBufferedReader=Java.use('java.io.BufferedReader');

//Intercepttherequest

HttpURLConnection.getOutputStream.implementation=function(){

varoutputStream=this.getOutputStream();

varrequestMethod=this.getRequestMethod();

varurl=this.getURL().toString();

//PrintouttherequestmethodandURL

console.log('[+]Intercepted'+requestMethod+'requestto'+url);

//Readtherequestbody

varrequest='';

//GettheInputStreamobject

varinputStream=this.getInputStream();

//CreateanewInputStreamReaderobject

varinputStreamReader=InputStreamReader.$new.overload('java.io.InputStream','java.lang.String')(inputStream,'UTF-8');

//CreateanewBufferedReaderobject

varBufferedReader_instance=BufferedReader.$new.overload('java.io.Reader')(inputStreamReader);

varline='';

while((line=BufferedReader_instance.readLine())!=null){

request+=line;

}

//Printouttherequestbody

console.log('[+]Requestbody:'+request);

//Modifytherequest

if(requestMethod=='POST'){

varmodifiedRequest='param1=value1param2=value2';

console.log('[+]Modifyingrequestbodyto:'+modifiedRequest);

//GettheOutputStreamWriterconstructor

varOutputStreamWriter=Java.use('java.io.OutputStreamWriter');

//GettheCharsetandStandardCharsetsclasses

varCharset=Java.use('java.nio.charset.Charset');

varStandardCharsets=Java.use('java.nio.charset.StandardCharsets');

//GettheOutputStreamobject

varoutputStream=this.getOutputStream();

//GettheUTF-8Charsetobject

varutf8Charset=StandardCharsets.UTF_8;

//CreateanewOutputStreamWriterobject

varoutputStreamWriter=OutputStreamWriter.$new.overload('java.io.OutputStream','java.nio.charset.Charset')(outputStream,utf8Charset);

outputStreamWriter.write(modifiedRequest);

outputStreamWriter.flush();

outputStreamWriter.close();

}

returnoutputStream;

};

//Intercepttheresponse

HttpURLConnection.getInputStream.implementation=function(){

varinputStream=this.getInputStream();

//Readtheresponsebody

varresponse='';

//GettheInputStreamobject

varinputStream=this.getInputStream();

//CreateanewInputStreamReaderobject

varinputStreamReader=InputStreamReader.$new.overload('java.io.InputStream','java.lang.String')(inputStream,'UTF-8');

//CreateanewBufferedReaderobject

varBufferedReader_instance=BufferedReader.$new.overload('java.io.Reader')(inputStreamReader);

varline='';

while((line=BufferedReader_instance.readLine())!=null){

response+=line;

}

//Printouttheresponsebody

console.log('[+]Responsebody:'+response);

returninputStream;

};

});該腳本攔截HTTP 請求和應用程序響應並顯示有關它們的信息,包括:

請求方式

網址

請求正文

響應體

它還演示瞭如何使用

監視系統調用(syscall) 和分析系統行為可以幫助您調試產品並提高其性能、安全性和合規性。然而,由於缺乏內置工具以及需要逆向工程和應用程序行為分析的專業知識,監視Windows 中的系統調用面臨著挑戰。

在本文中,我們討論在Windows 中監視系統調用的一些核心方法。

監控Windows 中的系統調用:查看內容以及原因係統調用是一種使程序能夠從操作系統內核請求各種類型的服務和任務的機制。系統調用為用戶級程序訪問系統資源提供了一種安全且受控的方式,而不會影響操作系統(OS) 的穩定性或安全性。當執行請求的操作時,系統調用在用戶模式和內核模式之間轉移控制。

系統調用是ring-0/ring-3隔離的標準部分。讓我們仔細看看。

在操作系統中,有兩種代碼環境:以完全權限運行的內核代碼(環0)

以有限權限運行的用戶代碼(環3)

在這些環境之間,有一個系統調用接口。

環0 和環3 之間的劃分(內核級別和用戶級別)是觀察應用程序行為和原始操作的最佳點。當代碼達到系統調用級別時,應用程序無法混淆其操作。例如,如果用戶級代碼秘密調用CreateFile()函數,您仍然可以通過監視系統調用來檢測到這一點,因為您將看到NtCreateFile 系統調用的執行。

對於大多數流行的體系結構,包括x86、AMD64、ARM64 和PowerPC,處理系統調用的方法是相同的:在用戶級別,一組系統API 充當系統調用的包裝器。

在內核級別,內核API 實現系統調用的處理程序並由內核驅動程序使用。

在某些體系結構中,系統調用稱為系統服務。

Windows 中系統調用的常見示例包括:文件輸入/輸出(I/O) 操作,例如讀取或寫入文件

流程管理,例如創建新流程或終止現有流程

內存管理,例如分配內存

進程間通信,例如在進程之間發送或接收消息

設備驅動程序操作,例如向硬件設備發送命令

為什麼您的開發人員需要監視系統調用?

Windows 系統調用監控對於研究多層軟件和分析具有混淆代碼的應用程序的行為至關重要。使用這種方法,您可以確定特定應用程序的行為方式,而無需分析應用程序每個級別的代碼。

監控系統調用的常見原因包括:調試—— 跟踪應用程序中的問題,確定其根本原因,并快速修復錯誤。

性能優化——識別瓶頸並優化有問題的代碼部分以提高整體性能。

安全——檢測可疑的、潛在的惡意行為,並採取措施阻止其發生。

合規性——通過分析應用程序訪問和使用特定類型數據的方式,確保應用程序符合相關要求。

image.png

然而,在實踐中應用這種方法面臨著多重挑戰。它需要深入了解操作系統的細節以及逆向工程和應用程序行為分析的利基知識。在下一節中,我們將根據Apriorit 專家的經驗,討論開發人員在嘗試監視Windows 中的系統調用時可能面臨的關鍵問題。

Windows 中的系統調用監控挑戰與Linux 具有用於監視任何進程中的系統調用的strace工具相比,Windows 由於安全原因沒有用於此任務的內置工具。然而,在Windows XP 之前,任何需要監視或控制用戶級代碼的軟件(例如防病毒軟件)都可以在兩個表中設置掛鉤:

系統服務描述符表(SSDT)

影子系統服務描述符表(影子SSDT)

這些表包含指向處理特定係統調用的內核函數的指針。

在SSDT 和Shadow SSDT 中設置掛鉤會導致大量衝突和不穩定,導致Windows 聲譽受損,並使其看起來像一個不可靠的操作系統。除此之外,rootkit 和病毒還能夠在SSDT 和Shadow SSDT 中設置掛鉤。這就是為什麼微軟被迫阻止對這些表的訪問,並且從Windows XP開始,實施了PatchGuard,也稱為內核補丁保護。從那時起,系統監控工具只能為一小部分內核事件設置回調,這使得系統調用的監控變得非常具有挑戰性。

下面,我們討論如何監視Windows 中的系統調用,並解釋一種安全有效的方法來分析Windows 中的程序行為。

使用XPerf 監控Windows 系統調用在Windows XP 中,Microsoft 引入了Windows 事件跟踪(ETW)機制,用於XPerf工具使用的詳細事件日誌記錄。後者現在是Windows Performance Toolkit的一部分。

一般來說,微軟將ETW 回調放置在整個Windows 子系統中,以便能夠跟踪低級事件。使用ETW,您可以獲取系統事件,因此XPerf 對於監視系統調用也可能很有用。

讓我們看看如何使用XPerf 來監視Windows 中的系統調用。

首先,我們查詢ETW 提供者,看看是否有與系統調用相關的內容:

logman.exequeryproviders在我們從XPerf 收到的信息中,沒有任何看起來像系統調用的內容。轉到TraceView 並監視名稱如Microsoft-Windows-Kernel-* 的內核提供程序事件,也為我們帶來了各種類型的內核事件,但沒有有關係統調用的結果。

下一個可能性是使用SystemTraceProvider一個跟踪內核事件的內核提供程序。將這個提供程序的GUID 添加到TraceView 後,我們仍然沒有結果。

為了尋找設置掛鉤的可能替代方案,我們嘗試了不同的方法來監視Windows 中的系統調用,包括通過虛擬機管理程序掛鉤SSDT 函數以及使用Windows 事件跟踪的未記錄部分。

使用Syscall Monitor 和InfinityHook 監控Windows 系統調用為了尋找替代解決方案,我們決定研究一下記錄較少的監控系統調用的方法。

免責聲明:以下操作僅用於研究目的。

在研究了幾種可能性之後,我們在GitHub 上發現了兩個有前途的項目:系統調用監視器

無限鉤

讓我們從測試Syscall Monitor 工具開始。該項目使用虛擬機擴展通過虛擬機管理程序掛鉤SSDT 功能。該方法本身有效,使得監視Windows 中的系統調用成為可能。不幸的是,作者決定實現該工具作為ProcessMonitor的替代品。因此,Syscall Monitor 的能力有限,只能監控一小部分系統調用:

image.png屏幕截圖1. 使用Syscall Monitor 的結果

總而言之,Syscall Monitor 是一個很好的工具,可以幫助您開始研究SSDT 掛鉤,但如果您想監視圖形設備接口(GDI) 系統調用等內容,則該工具就沒用了。

現在,讓我們繼續測試InfinityHook 工具的使用。根據該工具的描述,在使用它之前,您需要了解ETW的基礎知識。

為了監視Windows 中的系統調用,InfinityHook 在系統調用處理程序的內核代碼中使用ETW 跟踪的未記錄部分。值得注意的是,該項目無法輕鬆地開箱即用,我們必須在設法運行代碼之前實現一些細微的更改。然而,結果我們得到了BSOD:

image.png屏幕截圖2. 使用InfinityHook 工具的結果

從上面的屏幕截圖中可以看到,我們收到一條錯誤消息,內容為“停止代碼:KERNEL_SECURITY_CHECK_FAILURE”。此消息意味著內核補丁保護已被觸發。顯然,最新版本的Windows 保護內核ETW 提供程序回調免受修改,因此為了監視Windows 系統調用,我們需要禁用PatchGuard。

在Windows 10 中禁用PatchGuard 的一種方法是使用EfiGuard項目。按照GitHub 的說明,我們使用軟盤映像啟動Windows 10 的VMWare 實例,用於此類研究和實驗:

image.png

屏幕截圖3. 使用EfiGuard 工具的結果

我們嘗試了幾種不同的驅動程序簽名強制繞過方法,但結果仍然相同- 我們仍然遇到由內核補丁保護觸發的BSOD。經過進一步調查,我們確定EfiGuard 在不同的Windows 版本上成功運行- 具體來說,Windows 10 版本1511。

然後,我們創建了一個新的VMWare 映像,並在其上安裝了Windows 10 build 1511,並嘗試使用EfiGuard 再次禁用PatchGuard。這一次,我們的嘗試成功了,我們終於成功運行了InfinityHook項目。 InfinityHook 使用DbgPrint()

函數打印有關來自驅動程序的系統調用的信息。因此,我們需要使用DebugView工具來查看其日誌。

image.png屏幕截圖4. InfinityHook 中的系統調用監控結果

從上面的截圖可以看出,InfinityHook提供了以下數據:系統調用索引

EPROCESS值

系統調用的堆棧指針

索引超過4000 的系統調用是GDI 調用。為了正確地將索引映射到系統調用的名稱,您需要知道與您的計算機運行的內核版本相關的系統調用索引。您還可以嘗試使用互聯網上提供的系統調用表之一進行進一步研究。

然而,由於這種方法需要額外的努力,我們嘗試尋找一種更方便、更安全的方法來監視Windows 中的系統調用。在下一節中,我們將詳細討論如何使用DTrace 來監視Windows 系統調用。

使用DTrace 監控Windows 系統調用DTrace是一個動態跟踪框架,允許開發人員在用戶模式和內核模式下實時分析系統行為。該框架最初由Sun Microsystems 為Solaris 操作系統開發,後來移植到其他類Unix 操作系統,例如macOS和Linux。

目前,微軟還支持DTrace,使開發人員和軟件研究人員能夠監控從Windows 10 Build 1903開始的64位平台上的系統調用。但是,該工具只能捕獲64位進程的痕跡。

GitHub 上的DTraceon Windows頁麵包含有關如何安裝它的易於遵循的說明,因此我們將在概述中省略這部分。

默認情況下,系統將DTrace 放置在C:\Program Files\DTrace文件夾中。要使用它,您需要以管理員身份運行以下命令:

dtrace-lnsyscall:運行此命令後,DTrace 應打印系統中可用於監視的系統調用列表。

注意:每個系統調用都會打印兩次,因為您可以監視系統調用參數及其返回值。

接下來,運行以下用D語言編寫的腳本繼續進行系統調用監控:

syscall:/pid==9140/{printf('%scalled\n',execname);}這個特定的腳本打印PID=9140 的進程的所有系統調用。通過更改PID,您可以監視您感興趣的任何其他進程的系統調用。

將腳本保存為test.d 文件,然後您可以使用簡單的命令運行它:

Dtrace-stest.d要了解其工作原理,讓我們運行記事本腳本。我們收到以下結果:

image.png

屏幕截圖5. 使用DTrace 監控記事本系統調用

您可以隨時按Ctrl+C停止使用DTrace 監視Windows 系統調用。

要了解有關使用DTrace 腳本和可能的系統監控方法的更多信息,您可以探索Microsoft 在DTrace GitHub 頁面上提供的示例。

結論監視系統調用可以提供有關應用程序行為和性能的寶貴見解,從而幫助開發人員創建更可靠、更高效、更安全的應用程序。要監視Windows 中的系統調用,可以使用Microsoft 官方支持的DTrace 實現。