深度學習後門攻擊分析與實現(二)

蚁景网安实验室發表於2024-09-27

前言

在本系列的第一部分中,我們已經掌握了深度學習中的後門攻擊的特點以及基礎的攻擊方式,現在我們在第二部分中首先來學習深度學習後門攻擊在傳統網路空間安全中的應用。然後再來分析與實現一些頗具特點的深度學習後門攻擊方式。

深度學習與網路空間安全的交叉

深度學習作為人工智慧的一部分,在許多領域中取得了顯著的進展。然而,隨著其廣泛應用,深度學習模型的安全性也引起了廣泛關注。後門攻擊就是其中一種重要的威脅,尤其在網路空間安全領域中。

我們已經知道深度學習後門攻擊是一種攻擊者透過在訓練過程中插入惡意行為,使得模型在特定的觸發條件下表現異常的攻擊方式。具體來說,攻擊者在訓練資料集中加入帶有後門觸發器的樣本,使得模型在遇到類似的觸發器時,產生攻擊者期望的錯誤輸出,而在正常情況下,模型仍能表現出高準確率。這種隱蔽性和針對性使得後門攻擊非常難以檢測和防禦。

現在我們舉幾個例子介紹後門攻擊在網路空間安全中的應用場景。

惡意軟體檢測:在網路安全中,惡意軟體檢測是一個重要應用。攻擊者可以透過後門攻擊技術,使得惡意軟體檢測模型在檢測特定樣本時失效。例如,攻擊者可以在訓練惡意軟體檢測模型時插入帶有後門的惡意樣本,使得模型在檢測帶有特定觸發器的惡意軟體時無法正確識別,從而達到隱蔽惡意軟體的目的。

image-20240731095843483

入侵檢測系統:入侵檢測系統(Intrusion Detection System, IDS)用於監測網路流量並識別潛在的入侵行為。攻擊者可以在訓練IDS模型時加入後門觸發器,使得模型在特定條件下無法識別攻擊流量。例如,攻擊者可以在訓練資料中插入帶有特定模式的正常流量,使得模型在檢測到這些模式時誤判為正常,從而繞過入侵檢測系統。

image-20240731095934308

影像識別安全:在網路空間安全中,影像識別技術被廣泛應用於身份驗證和監控系統中。攻擊者可以利用後門攻擊,在訓練影像識別模型時插入帶有後門的影像樣本,使得模型在識別帶有特定觸發器的影像時出現誤判。例如,攻擊者可以使得帶有特定標誌的非法影像被識別為合法,從而繞過安全監控系統。

image-20240731100025409

可見後門攻擊與網路空間安全其他領域還是存在不少交叉的。

現在我們繼續來分析並實現、復現典型的深度學習後門攻擊方法。

BppAttack

理論

這篇工作提出了一種名為BPPATTACK的深度神經網路(DNN)木馬攻擊方法。該攻擊利用了人類視覺系統對影像量化和抖動處理不敏感的特性,透過這些技術生成難以被人類察覺的觸發器,進而實現對DNN的高效、隱蔽的木馬攻擊。

現有的攻擊使用可見模式(如影像補丁或影像變換)作為觸發器,這些觸發器容易受到人類檢查的影響。比如下圖就可以看到很明顯的觸發器。

image-20240727210502284

BPPATTACK方案的核心思想是利用人類視覺系統對影像微小變化的不敏感性,透過影像量化和抖動技術生成難以被人類察覺的觸發器,實現對深度神經網路(DNN)的高效、隱蔽的木馬攻擊。

人類視覺系統對顏色深度的變化不是特別敏感,特別是當顏色變化非常微小的時候。BPPATTACK正是基於這一生物學原理,透過調整影像的顏色深度來生成觸發器。

  1. 影像量化(Bit-Per-Pixel Reduction)

    • 影像量化是減少影像中每種顏色的位元數,從而減少影像的總顏色數量。BPPATTACK透過降低每個畫素的位元深度,使用量化後的最近鄰顏色值來替換原始顏色值,實現對影像的微小修改。

  2. 抖動技術(Dithering)

    • 為了消除由於顏色量化引起的不自然或明顯的影像偽影,BPPATTACK採用抖動技術,特別是Floyd-Steinberg抖動演算法,來平滑顏色過渡,提高影像的自然度和視覺質量。

      BPPATTACK旨在生成一種觸發器,它對人類觀察者來說是幾乎不可察覺的,但對機器學習模型來說足夠顯著,能夠觸發預設的木馬行為。這種平衡是透過精確控制量化和抖動的程度來實現的。

    • 與需要訓練額外的影像變換模型或自編碼器的攻擊不同,BPPATTACK不需要訓練任何輔助模型,這簡化了攻擊流程並提高了效率。

    • 為了提高攻擊的成功率和隱蔽性,BPPATTACK採用了對比學習和對抗性訓練的結合。透過這種方式,模型被訓練來識別和利用量化和抖動生成的觸發器,同時忽略其他不重要的特徵。

量化過程涉及將原始影像的顏色深度從( m )位減少到( d )位(( d < m ))。對於每個畫素值,使用以下公式進行量化:

image-20240727210819783

其中:

  • ( T(x) ) 是量化後的畫素值。

  • ( x ) 是原始畫素值。

  • ( m ) 是原始顏色深度的位數(每個通道)。

  • ( d ) 是量化後的目標顏色深度的位數。

  • ( \text{round} ) 是四捨五入到最近的整數。

Floyd-Steinberg Dithering:抖動演算法用於改善量化後的影像質量,透過將量化誤差擴散到鄰近畫素。對於每個畫素,計算量化誤差並更新周圍畫素:

image-20240727210836408

然後,根據Floyd-Steinberg分佈,更新當前畫素和周圍畫素:

image-20240727210916608

BPPATTACK方案的關鍵在於透過量化和抖動技術生成的微小變化對人類視覺系統是不可見的,但對DNN模型是可區分的,從而實現隱蔽的木馬攻擊。

【----幫助網安學習,以下所有學習資料免費領!加vx:dctintin,備註 “部落格園” 獲取!】

 ① 網安學習成長路徑思維導圖
 ② 60+網安經典常用工具包
 ③ 100+SRC漏洞分析報告
 ④ 150+網安攻防實戰技術電子書
 ⑤ 最權威CISSP 認證考試指南+題庫
 ⑥ 超1800頁CTF實戰技巧手冊
 ⑦ 最新網安大廠面試題合集(含答案)
 ⑧ APP客戶端安全檢測指南(安卓+IOS)

實現

我們來看看該方法得到的部分中毒樣本

image-20240727211016338

image-20240727211031242

image-20240727211047210

分析關鍵函式

  • Bpp:繼承自 BadNet,新增了命令列引數處理和資料集準備功能,用於特定處理階段。

  • set_bd_args 方法:配置與攻擊設定相關的命令列引數。

  • stage1_non_training_data_prepare 方法:準備和變換資料集,設定 DataLoader,並儲存階段 1 的結果。

image-20240727211138056

1. 類定義與初始化

  • 類宣告:

    • class Bpp(BadNet): BppBadNet 的一個子類。

  • 建構函式 (__init__ 方法):

    • def __init__(self):: 這是 Bpp 的初始化方法。

    • super(Bpp, self).__init__(): 呼叫父類 BadNet 的建構函式,以確保執行父類中的初始化邏輯。

2. 設定命令列引數

  • set_bd_args 方法:

    • def set_bd_args(cls, parser: argparse.ArgumentParser) -> argparse.ArgumentParser:: 這個類方法用於使用 argparse 庫設定命令列引數。

    • parser = add_common_attack_args(parser): 呼叫 add_common_attack_args 函式,新增與攻擊相關的常見引數。

    • parser.add_argument(...): 新增各種命令列引數:

      • --bd_yaml_path: 指定一個 YAML 檔案的路徑,用於提供額外的預設屬性。

      • --neg_ratio, --random_rotation, --random_crop, --squeeze_num, --dithering: 各種與攻擊配置相關的引數,如負比率、旋轉、裁剪、壓縮和抖動。

  • 返回值:

    • 返回更新後的 parser 物件,其中包含所有新增的引數。

3. 準備第一階段的資料

  • stage1_non_training_data_prepare 方法:

    • def stage1_non_training_data_prepare(self):: 這個方法用於準備第一階段的資料。

    • 日誌記錄與斷言:

      • logging.info("stage1 start"): 記錄階段 1 的開始。

      • assert "args" in self.__dict__: 確保 args 屬性存在於例項中。

    • 資料集準備:

      • train_dataset_without_transform, train_img_transform, train_label_transform, 等變數:這些變數被賦值為呼叫 self.benign_prepare() 的結果,該方法用於準備資料集和變換。

      • clean_train_dataset_with_transform.wrap_img_transform = test_img_transform: 將訓練資料集的影像變換更新為與測試資料集的影像變換一致。

    • DataLoader 初始化:

      • clean_train_dataloader: 一個用於清潔訓練資料集的 DataLoader,應用了變換。

      • clean_train_dataloader_shuffled: 一個用於清潔訓練資料集的 DataLoader,但資料是打亂的。

      • clean_test_dataloader: 一個用於清潔測試資料集的 DataLoader。

  • 儲存結果:

    • self.stage1_results: 儲存各種資料集和 DataLoader 以備階段 1 進一步使用。

image-20240727211325748

這段程式碼是一個神經網路訓練和評估的流程,具體針對的是後門攻擊(backdoor attack)的研究

  1. 初始化

    • 程式碼開始時,記錄訓練階段2的開始時間。

    • 透過斷言檢查 self 物件中是否包含 args 屬性,獲取訓練引數。

  2. 裝置選擇

    • 根據是否有可用的 GPU 來設定計算裝置。如果 args.device 包含多個裝置(例如 "cuda:2,3,7"),則使用 torch.nn.DataParallel 來平行計算。

  3. 模型生成

    • 呼叫 generate_cls_model 函式生成分類模型 netC,並將其移動到指定的裝置上。

  4. 最佳化器和學習率排程器

    • 呼叫 argparser_opt_scheduler 函式獲取最佳化器和學習率排程器。

  5. 資料預處理

    • 過濾出可逆的影像變換(如標準化、縮放、轉換為張量)。

    • 建立乾淨和背門攻擊的資料集,分別儲存處理後的資料集。

  6. 訓練資料處理

    • 遍歷乾淨訓練資料,透過反歸一化得到原始影像。

    • 根據攻擊標籤轉換型別("all2one" 或 "all2all")來生成背門攻擊資料。

    • 處理資料集中的每一批次,並將乾淨樣本和背門樣本儲存到資料集中。

  7. 測試資料處理

    • 對測試資料進行類似的預處理和儲存操作,包括處理乾淨測試資料和背門測試資料。

    • 評估背門效果,並根據攻擊標籤轉換型別生成相應的標籤和資料。

  8. 負樣本生成

    • 如果指定了負樣本比率(neg_ratio),生成負樣本資料。這些負樣本用於評估背門攻擊的效果。

    • 將負樣本與其他資料合併,並儲存處理後的資料。

  9. 模型訓練和評估

    • 對每個 epoch 執行訓練和評估步驟。記錄訓練損失、準確率、背門攻擊成功率等指標。

    • 將每個 epoch 的訓練和測試結果儲存到列表中,並繪製訓練和測試指標的圖表。

  10. 模型儲存和結果輸出

    • 在訓練週期結束時儲存模型狀態、學習率排程器狀態、最佳化器狀態等。

    • 將訓練和測試結果儲存到 CSV 檔案中,並生成最終的攻擊結果資料。

  11. 完成

    • 輸出“done”表示訓練和儲存過程已完成。

每個步驟都有明確的目標,從資料處理到模型訓練,再到最終結果儲存,涵蓋了整個訓練和評估的過程。

image-20240727211508555

這段程式碼包含了兩個主要的函式:train_stepeval_step。它們分別用於訓練和評估模型

train_step 函式

功能: 執行一個訓練步驟,處理資料、計算損失、更新模型權重,並計算各種指標。

  1. 初始化:

    • 記錄日誌,設定模型為訓練模式。

    • 獲取訓練引數,包括背門比率(rate_bd)和壓縮數(squeeze_num)。

    • 初始化交叉熵損失函式(criterion_CE)和資料轉換物件(transforms)。

    • 初始化一些用於記錄的列表。

  2. 資料處理:

    • 對每個批次的資料進行處理:

      • 清空最佳化器的梯度。

      • 將輸入資料和目標標籤移動到指定裝置(GPU/CPU)。

      • 計算背門樣本和負樣本的數量。

      • 根據是否存在背門樣本和負樣本,生成相應的資料:

        • 背門樣本: 對背門樣本進行處理(如抖動處理)並生成標籤。

        • 負樣本: 生成負樣本資料併合併到訓練資料中。

      • 處理資料集中的每一批次,將背門樣本和負樣本合併到一起。

      • 應用資料轉換函式。

  3. 模型訓練:

    • 計算模型的預測結果,並記錄計算時間。

    • 計算損失,進行反向傳播,更新最佳化器。

    • 記錄每個批次的損失、預測結果、標籤等資訊。

  4. 計算指標:

    • 計算每個 epoch 的平均損失和準確率。

    • 根據背門樣本、負樣本和乾淨樣本的指標,計算背門攻擊成功率(ASR)、乾淨樣本準確率等。

  5. 返回:

    • 返回訓練過程中的各種指標:平均損失、混合準確率、乾淨樣本準確率、背門攻擊成功率、背門樣本恢復準確率、交叉樣本準確率。

eval_step 函式

功能: 執行模型評估,計算不同資料集(乾淨資料集、背門資料集、交叉資料集等)的損失和準確率。

  1. 清潔測試資料集評估:

    • 使用 given_dataloader_test 函式評估乾淨測試資料集,獲取損失和準確率。

  2. 背門資料集評估:

    • 使用 given_dataloader_test 函式評估背門測試資料集,獲取損失和準確率。

  3. 背門樣本恢復(RA)資料集評估:

    • 對背門樣本恢復資料集進行轉換和評估,獲取損失和準確率。

  4. 交叉資料集評估:

    • 使用 given_dataloader_test 函式評估交叉測試資料集,獲取損失和準確率。

  5. 返回:

    • 返回不同資料集的損失和準確率:乾淨測試集損失和準確率、背門測試集損失和準確率、交叉測試集損失和準確率、恢復測試集損失和準確率。

這些函式一起構成了一個完整的訓練和評估流程,涵蓋了資料處理、模型訓練、指標計算和評估等多個方面。

開始進行後門注入

image-20240724195753735

攻擊配置如下所示

image-20240727211634482

訓練期間的部分截圖如下

image-20240724195822824

image-20240724195848070

image-20240724200623415

image-20240724200657266

也可以檢視acc的變化情況

image-20240724200755108

可以看到主要關注的指標都在穩步上升

以35epoch為例,此時的後門攻擊成功率達到了0.98,而深度學習模型執行正常任務的準確率達到了0.91

FTrojan

理論

FTrojan攻擊的核心思想是在頻率域中注入觸發器。這種方法利用了兩個關鍵直覺:

  • 在頻率域中的小擾動對應於整個影像中分散的小畫素級擾動,這使得影像在視覺上與原始影像難以區分。

  • 卷積神經網路(CNN)能夠學習並記住頻率域中的特徵,即使輸入的是空間域畫素。

FTrojan攻擊包括以下步驟:

  • 將影像從RGB色彩空間轉換到YUV色彩空間,因為人的視覺系統對YUV中的UV(色度)分量不那麼敏感。

  • 對影像的UV分量進行離散餘弦變換(DCT),將其從空間域轉換到頻率域。

  • 在頻率域中生成觸發器,選擇固定大小的頻率帶作為觸發器。

  • 應用逆DCT將影像從頻率域轉換回空間域。

  • 最後,將影像從YUV色彩空間轉換回RGB色彩空間。

我們來分析關鍵細節

FTrojan攻擊方法的核心在於利用頻率域的特性來注入難以被檢測到的後門觸發器。

  1. 顏色空間轉換(RGB到YUV)

    • 使用線性變換將RGB影像轉換為YUV空間。YUV空間將顏色影像分解為亮度(Y)和色度(U, V)分量。人的視覺系統對色度分量的變化不如亮度分量敏感,因此在色度分量中注入觸發器對視覺的影響較小。

  2. 離散餘弦變換(DCT)

    • 對YUV空間中的U和V分量應用DCT,將影像從空間域轉換到頻率域。DCT將影像表示為不同頻率的餘弦函式的集合,能量集中在低頻部分,高頻部分則包含影像的邊緣和細節資訊。

    DCT公式如下:

    image-20240727213411222

    其中,(X(u, v))是DCT係數,(x(x, y))是影像在空間域的畫素值,(M)和(N)是影像的寬度和高度,(u)和(v)是頻率索引。

  3. 觸發器生成

    • 在頻率域中選擇特定的頻率帶作為觸發器。觸發器的頻率和幅度是兩個關鍵引數:

      • 觸發器頻率:選擇中頻和高頻帶的組合,以平衡人類視覺感知的敏感性和觸發器的魯棒性。

      • 觸發器幅度:選擇適中的幅度以確保觸發器對CNN是可學習的,同時對人類視覺系統是不可見的。

  4. 逆離散餘弦變換(Inverse DCT)

    • 使用逆DCT將修改後的頻率域影像轉換回空間域,得到注入了後門觸發器的影像。

    逆DCT公式如下:

    image-20240727213421592

  5. 顏色空間轉換(YUV回到RGB)

    • 最後,將修改後的YUV影像轉換回RGB空間,因為大多數CNN模型是在RGB空間上訓練的。

完整的攻擊流程如下圖所示

image-20240727213503207

下圖是本方法生成的中毒樣本與觸發器,可以看到是具有一定隱蔽性的

image-20240727213319950

下圖是透過 FTrojan 攻擊來得到的中毒影像。混頻將觸發器混合在中頻和高頻成分中。我們可以觀察到,當觸發器存在於具有適中幅度的高頻和中頻成分中時,中毒影像在視覺上很難被檢測到。

image-20240727213519644

復現

攻擊類

image-20240727214507996

這段程式碼定義了一個 Ftrojann 類,繼承自 BadNet。下面是程式碼的功能解釋:

  1. set_bd_args 方法:

    • 這個方法用於設定命令列引數。它接受一個 argparse.ArgumentParser 物件作為輸入,並返回一個更新後的 ArgumentParser 物件。

    • add_common_attack_args(parser) 是一個函式呼叫,可能會向 parser 中新增一些通用的攻擊相關引數。

    • 新增了多個特定引數:

      • --channel_list:接收一個整數列表,代表頻道列表。

      • --magnitude:接收一個浮點數,表示強度。

      • --YUV:接收一個布林值,表示是否使用 YUV 格式。

      • --window_size:接收一個整數,表示視窗大小。

      • --pos_list:接收一個整數列表,表示位置列表。

      • --bd_yaml_path:接收一個字串,指定 YAML 檔案的路徑,該檔案提供附加的預設屬性。預設路徑是 ./config/attack/ftrojann/default.yaml

  2. add_bd_yaml_to_args 方法:

    • 這個方法用於將 YAML 檔案中的預設屬性新增到 args 引數中,並進行一些額外的處理。

    • args.bd_yaml_path 指定的路徑讀取 YAML 檔案內容,解析為字典 mix_defaults

    • args 物件中非 None 的引數更新到 mix_defaults 中。

    • args 物件的 __dict__ 屬性(儲存了所有引數)更新為合併後的字典。

    • 檢查 pos_list 的長度是否為偶數,如果不是,丟擲 ValueError

    • pos_list 轉換為一對一對的元組列表,例如,將 [x1, y1, x2, y2] 轉換為 [(x1, y1), (x2, y2)]

著重檢視對於資料集的處理程式碼

這個類的主要功能是處理帶有後門攻擊的影像資料集,支援影像和標籤的預處理、狀態恢復和複製。

image-20240727214543753

這段程式碼定義了一個名為 prepro_cls_DatasetBD_v2 的 PyTorch 資料集類。這個類擴充套件了 torch.utils.data.Dataset,用於處理帶有後門攻擊(backdoor attack)的資料集

  1. __init__ 方法:

    • 引數:

      • full_dataset_without_transform: 原始資料集,沒有應用任何變換。

      • poison_indicator: 一個可選的序列,表示哪些影像需要應用後門變換(使用 one-hot 編碼)。預設為 None,如果沒有提供,則初始化為全零的陣列。

      • bd_image_pre_transform: 應用在影像上的後門變換函式。

      • bd_label_pre_transform: 應用在標籤上的後門變換函式。

      • save_folder_path: 儲存後門影像的資料夾路徑。

      • mode: 當前模式,預設為 'attack'

    • 操作:

      • 初始化資料集和相關屬性。

      • 檢查 poison_indicator 的長度是否與資料集長度匹配。

      • 如果 poison_indicator 中的值大於等於 1,則呼叫 prepro_backdoor() 方法進行後門資料預處理。

      • 設定其他屬性,如 getitem_allgetitem_all_switch,用於控制資料集的取值方式。

  2. prepro_backdoor 方法:

    • 對所有需要後門變換的樣本進行處理。

    • 遍歷資料集的所有索引,如果 poison_indicator 表示該樣本需要變換,則應用影像和標籤的變換,並呼叫 set_one_bd_sample() 方法儲存變換後的樣本。

  3. set_one_bd_sample 方法:

    • 將影像和標籤變換後的樣本儲存到 bd_data_container 中。

    • 確保影像被轉換為 PIL 影像格式(如果不是的話)。

    • 更新 poison_indicator,標記該樣本為後門樣本。

  4. __len__ 方法:

    • 返回資料集中樣本的總數。

  5. __getitem__ 方法:

    • 根據索引獲取樣本。

    • 如果樣本是乾淨的(poison_indicator 為 0),則從原始資料集中獲取影像和標籤。

    • 如果樣本是後門的(poison_indicator 為 1),則從 bd_data_container 中獲取影像和標籤。

    • 根據 getitem_allgetitem_all_switch 的設定,返回不同格式的資料。

  6. subset 方法:

    • 根據給定的索引列表更新 original_index_array,從而選擇資料集的子集。

  7. retrieve_state 方法:

    • 返回當前物件的狀態,包括 bd_data_containergetitem_allgetitem_all_switchoriginal_index_arraypoison_indicatorsave_folder_path

  8. copy 方法:

    • 建立一個 prepro_cls_DatasetBD_v2 的副本。

    • 深度複製當前物件的狀態,並設定到新副本中。

  9. set_state 方法:

    • 根據提供的狀態檔案恢復物件的狀態。

    • 包括恢復 bd_data_container 和其他屬性。

在我們的實現中得到的部分中毒樣本如下所示

image-20240727214732437

image-20240727214745604

注入後門

image-20240724201324573

攻擊配置

image-20240727214826972

後門注入期間的部分截圖如下所示

image-20240724201745965

image-20240724203305049

以第38個epoch為例,此時的後門攻擊成功率達到了接近100%,而正常任務的準確率達到了0.91

CTRL

理論

之前我們提到的後門攻擊都是透過監督學習的方式實現的,這一節我們來分析自監督學習後門攻擊。

自監督學習(SSL)是一種無需標籤即可學習複雜資料高質量表示的機器學習正規化。SSL在對抗性魯棒性方面相較於監督學習有優勢,但是否對其他型別的攻擊(如後門攻擊)同樣具有魯棒性尚未明確。

CTRL攻擊透過在訓練資料中摻入少量(≤1%)的投毒樣本,這些樣本對資料增強操作具有抗性,使得在推理階段,任何含有特定觸發器的輸入都會被錯誤地分類到攻擊者預定的類別。

觸發器 ( r ) 是一種在輸入資料的頻譜空間中的擾動,它對資料增強(如隨機裁剪)不敏感。觸發器的設計使其在視覺上幾乎不可察覺,但在頻域中具有特定的模式。

  • 假設攻擊者可以訪問到一小部分目標類別的輸入樣本集 ( \tilde{D} )。

  • 透過在這些樣本上新增觸發器 ( r ) 來生成投毒資料 ( D^* )。

  • 嵌入:將觸發器 ( r ) 嵌入到輸入 ( x ) 中,形成觸發輸入 ( x^* = x \oplus r )。這裡 ( \oplus ) 表示觸發器嵌入操作。

  • 啟用:在推理時,攻擊者可以調整觸發器的幅度來啟用後門,而不影響模型對清潔資料的分類效能。

SSL中的對比損失函式旨在最小化正樣本對(相同輸入的不同增強檢視)之間的距離,同時最大化負樣本對(不同輸入)之間的距離。對比損失可以表示為:

image-20240727212402498

其中,( f ) 是編碼器,( x_i ) 和 ( x_j ) 是正樣本對,( y_{ij} ) 是指示器(如果 ( x_i ) 和 ( x_j ) 是正樣本對,則為1,否則為0),( \tau ) 是溫度引數。

CTRL攻擊利用了SSL的表示不變性屬性,即不同增強檢視的同一輸入應具有相似的表示。數學上,這可以表示為:

image-20240727212415243

這裡,( x^* ) 是觸發輸入,( x^+ ) 是增強後的正樣本,( r ) 是觸發器,( \alpha ) 是混合權重。

透過調整觸發器的幅度,攻擊者可以控制攻擊的效果。

完整的攻擊流程如下圖所示

image-20240727212444208

下圖演示了觸發器的生成流程

image-20240727212508356

復現

分析關鍵程式碼

ctrl類的stage1_non_training_data_prepare` 方法負責準備背門攻擊的資料,包括訓練和測試資料集的生成。它先從乾淨資料中準備基礎資料,然後生成背門樣本,最後建立背門訓練和測試資料集,並將結果儲存以備後續使用。這一過程涵蓋了從資料預處理到背門攻擊資料的生成,並最終包裝成適合訓練和評估的格式。

image-20240727212609910

這段程式碼是一個名為 ctrl 的類的定義,它繼承自 BadNet 類。主要功能是準備階段1的資料,包括生成後門攻擊資料和測試資料

1. set_bd_args 方法

功能: 設定用於背門攻擊的命令列引數。

  • bd_yaml_path: 指定 YAML 配置檔案的路徑。

  • use_dct: 布林值,指示是否使用 DCT(離散餘弦變換)。

  • use_yuv: 布林值,指示是否使用 YUV(影片色彩空間)。

  • trigger_channels: 觸發器的通道。

  • pos_list: 觸發器的位置。

2. stage1_non_training_data_prepare 方法

功能: 準備資料,包括清潔訓練資料、背門訓練資料和測試資料。

  1. 初始化:

    • 記錄日誌並確保 args 存在。

    • benign_prepare 方法中獲取不同的資料集和轉換方法。

  2. 生成背門資料集:

    • 呼叫 bd_attack_img_trans_generatebd_attack_label_trans_generate 方法生成背門資料集所需的影像和標籤轉換。

    • 使用 generate_poison_index_from_label_transform 方法生成訓練資料中的背門樣本索引。

    • 儲存背門樣本索引到檔案。

  3. 建立背門訓練資料集:

    • 使用 prepro_cls_DatasetBD_v2 方法生成背門訓練資料集,並應用轉換。

    • 建立資料集包裝器 dataset_wrapper_with_transform

  4. 生成背門測試資料集:

    • 使用 generate_poison_index_from_label_transform 方法生成測試資料中的背門樣本索引。

    • 使用 prepro_cls_DatasetBD_v2 方法生成背門測試資料集,並應用轉換。

    • 使用 subset 方法篩選測試資料集中的背門樣本。

  5. 儲存結果:

    • 將準備好的資料集儲存到 self.stage1_results 中。

執行

image-20240724200552969

攻擊配置如下

image-20240727212859173

訓練期間部分截圖如下

image-20240724201053304

image-20240724201121175

image-20240724201143427

可以看到,CTRL在後門攻擊成功率上稍低,比如在第59個epoch時,攻擊成功率為0.93,正常任務準確率為0.93。

更多網安技能的線上實操練習,請點選這裡>>

相關文章