第三章 應用於網路安全中可延展的字樣比對架構之預
3.2 預先過濾器架構及相關定義
3.2.4 主位元組列
圖-3.8:具有主位元組列的預先過濾器
圖-3.8 為一具有主位元組列的預先過濾器。主位元組列,mb1、mb2、mb3以 及 mb4的儲存規則如下之歸納:
主位元組列的初始值
1 2 3 4 1111
MB=mb mb mb mb =
情況 1:r4的值為 1
將搜尋視窗的起始位址儲存於可疑字樣位址儲存處,並根據 r1r2r3的值 來決定可向前移動之位元組個數。
情況 2:r1r2r3的值為 000
表示可向前移動之位元組個數為 4 個。因此,MB 向右位移 4 個位元組 並將其不足之處補上一個 1,即MBcurrent =mb mb mb mb1 2 3 4,MBnext =1111。
第三章 應用於網路安全中可延展的字樣比對架構之預先過濾器
表示可向前移動之位元組個數為 3 個。因此,MB 向右位移 3 個位元組 並 將 其 不 足 之 處 補 上 一 個 1 , 即 MBcurrent =mb mb mb mb1 2 3 4 ,
111 1
MBnext = mb
4
。
情況 4:r1r2r3的值為 r110
表示可向前移動之位元組個數為 2 個。因此,MB 向右位移 2 個位元組 並 將 其 不 足 之 處 補 上 一 個 1 , 即 MBcurrent =mb mb mb mb1 2 3 ,
1 2
next 11
MB = mb mb
4
。
情況 5:r1r2r3的值為 r1 r21
表示可向前移動之位元組個數為 1 個。因此,MB 向右位移 1 個位元組 並 將 其 不 足 之 處 補 上 一 個 1 , 即 MBcurrent =mb mb mb mb1 2 3 ,
1 2
next 1 3
MB = mb mb mb 。
主位元組列的功用為提升每一次可移動位元組的個數,使其整體吞吐量 (Throughput)可以大幅提升。我們的實驗結果將可告訴我們,有主位元組列之預 先過濾器比沒有主位元組列之預先過濾器的吞吐量最高可高於近 50%,我們將在 其後加以說明。在這我們將舉例(例 3.3)說明主位元組列所帶來的優點。
例 3.3:現有一預先過濾器,其 m=6, k=3,假設第一次與第二次成員詢問模 塊的輸出值分別為 1010 以及 0010。
沒有主位元組列之預先過濾器
搜尋視窗每一次僅可向前移動一個位元組,如圖-3.9 所示。
第三章 應用於網路安全中可延展的字樣比對架構之預先過濾器
圖-3.9:不具有主位元組列之預先過濾器的搜尋視窗移動概觀
有主位元組列之預先過濾器
圖-3.10:具有主位元組列之預先過濾器的搜尋視窗移動概觀
¾ 第一次成員詢問模塊的輸出值,1010,將與主位元組列的初始值,
1111,作『逐位和操作(Bitwise AND operation)』。所得之結果為
第三章 應用於網路安全中可延展的字樣比對架構之預先過濾器
1 2 3 4 { 1 1, , , } 10102 1 3 1 4 1
R r r r r= = mqm mb mqm mb mqm mb mqm mb =
,根據主位元組列的規則表示
9 不須將起始位址儲存於可疑字樣位址儲存處。
9 可向前移動之位元組個數為 1 個。因此,MB 向右位移 1 個位 元 組 並 將 其 不 足 之 處 補 上 一 個 1 , 即 1111,
1101。
current
MB =
MBnext =
¾ 第二次成員詢問模塊的輸出值,0010,將與主位元組列,1101,作 逐位和操作。所得之結果為R={0 1, 0 1, 1 0, 0 1} 0000= , 根據主位元組列的規則表示
9 不須將起始位址儲存於可疑字樣位址儲存處。
9 可向前移動之位元組個數為 4 個。因此,MB 向右位移 4 個位 元 組 並 將 其 不 足 之 處 補 上 一 個 1 , 即 1101,
1111。
current
MB =
MBnext =
我們從例 3.3 明顯地得知,第二次的結果,有主位元組列之預先過濾器 可向前移動的位元組個數是沒有主位元組列之預先過濾器的 4 倍,這說明了 主位元組列功能的必要性與優越性。
第四章 基於 FPGA 的預先過濾器
第四章
基於 FPGA 的預先過濾器
4.1 字樣比對架構的系統雛型
圖-4.1:我所提出實現於 FPGA 的字樣比對系統雛型
圖-4.1 為我所提出將要實現於 FPGA 的字樣比對系統雛型。圖中主要分成四 大部分,分別為測試文件檔(Text File)、可疑位址儲存處(Jail)、預先過濾器 (Prefilter),以及驗證器(AC)。在這,我將利用子節 4.3、子節 4.4 及子節 4.5 分別 針對前三部分的實作細節作一一深入的介紹與分析。
第四章 基於 FPGA 的預先過濾器
4.2 測試板-Xilinx Virtex II Pro ML310 介紹
在進入正題前我們要先針對我們所選用的 FPGA 板子作一大致上的說明,因 為所選用作為測試板的內部元件將會對我們所設計的系統雛型有所牽動與影響。
圖-4.2:Xilinx Virtex II Pro ML310 FPGA 測試板
我們所選用的測試板為 Xilinx 公司所出產的 Virtex II Pro ML310,如圖-4.2 所示。Virtex II Pro 系列的 FPGA 採用 0.13um、1.5V 的處理技術所製造而成,整
合了嵌入式 PowerPC405 處理器和 3.125 Gbps RocketIO 串行收發器(Serial transceiver)。圖-4.3 為 ML310 FPGA 測試板的家族成員,而我們選用的是
XVC2VP30,在這我們須特別留意的是它的 BlockRAM 個數。XVC2VP30 共有 136 個 BlockRAM,每一個 BlockRAM 可以儲存 18,432(18K)個位元,故最高可
第四章 基於 FPGA 的預先過濾器
用的 BlockRAM 空間為 2448K 個位元。每一 BlockRAM 的儲存空間可分成資料 記憶體(Data memory,16K 個位元)以及同位檢查記憶體(Parity memory,2K 個位 元)兩個部份。所謂的同位檢查記憶體指的是,當每一個位址所取得的位元數稱 為 OB(Obtained Bits),則每一個位址內可加入的同位檢查位元(Parity bit)的個數 為 8
⎡OB⎤
⎢⎢ ⎥⎥。因此,同位檢查記憶體最大容量共 2K 個位元。此外,每一個位址所
取得的資料寬度可配置為 1、2、4、9(8 個資料位元加 1 個同位檢查位元)、18(16 個資料位元加 2 個同位檢查位元)以及 36 個位元((32 個資料位元加 4 個同位檢查 位元)),依使用者設定。
圖-4.3:ML310 FPGA 測試板的家族成員
每一個 BlockRAM 皆可宣告成單埠同步塊記憶體(Single-Port Synchronous Block RAM)或雙埠同步塊記憶體(Dual-Port Synchronous Block RAM)。其宣告方 式如下:
單埠同步塊記憶體,宣告為 RAMB16_Sn,n 依使用者設定。
RAMB16_Sn user_instance_name (.DO (user_DO), .DOP (user_DOP), .ADDR (user_ADDR), .CLK (user_CLK), .DI (user_DI), .DIP (user_DIP), .ENB(user_EN), .SSR (user_SSR), .WE (user_WE));
defparam user_instance_name.INIT_00 = 256’h_hex_value;
defparam user_instance_name.INIT_01 = 256’h_hex_value;
第四章 基於 FPGA 的預先過濾器
defparam user_instance_name.INIT_03 = 256’h_hex_value defparam user_instance_name.INIT_04 = 256’h_hex_value;
defparam user_instance_name.INIT_05 = 256’h_hex_value;
defparam user_instance_name.INIT_06 = 256’h_hex_value;
defparam user_instance_name.INIT_07 = 256’h_hex_value;
defparam user_instance_name.INIT_08 = 256’h_hex_value;
defparam user_instance_name.INIT_09 = 256’h_hex_value;
defparam user_instance_name.INIT_0A = 256’h_hex_value;
defparam user_instance_name.INIT_0B = 256’h_hex_value;
defparam user_instance_name.INIT_0C = 256’h_hex_value;
defparam user_instance_name.INIT_0D = 256’h_hex_value;
defparam user_instance_name.INIT_0E = 256’h_hex_value;
defparam user_instance_name.INIT_0F = 256’h_hex_value;
defparam user_instance_name.INIT_10 = 256’h_hex_value;
defparam user_instance_name.INIT_11 = 256’h_hex_value;
defparam user_instance_name.INIT_12 = 256’h_hex_value;
defparam user_instance_name.INIT_13 = 256’h_hex_value;
defparam user_instance_name.INIT_14 = 256’h_hex_value;
defparam user_instance_name.INIT_15 = 256’h_hex_value;
defparam user_instance_name.INIT_16 = 256’h_hex_value;
defparam user_instance_name.INIT_17 = 256’h_hex_value;
defparam user_instance_name.INIT_18 = 256’h_hex_value;
defparam user_instance_name.INIT_19 = 256’h_hex_value;
defparam user_instance_name.INIT_1A = 256’h_hex_value;
defparam user_instance_name.INIT_1B = 256’h_hex_value;
defparam user_instance_name.INIT_1C = 256’h_hex_value;
defparam user_instance_name.INIT_1D = 256’h_hex_value;
defparam user_instance_name.INIT_1E = 256’h_hex_value;
defparam user_instance_name.INIT_1F = 256’h_hex_value;
defparam user_instance_name.INIT_20 = 256’h_hex_value;
defparam user_instance_name.INIT_21 = 256’h_hex_value;
defparam user_instance_name.INIT_22 = 256’h_hex_value;
defparam user_instance_name.INIT_23 = 256’h_hex_value;
defparam user_instance_name.INIT_24 = 256’h_hex_value;
defparam user_instance_name.INIT_25 = 256’h_hex_value;
defparam user_instance_name.INIT_26 = 256’h_hex_value;
defparam user_instance_name.INIT_27 = 256’h_hex_value;
defparam user_instance_name.INIT_28 = 256’h_hex_value;
defparam user_instance_name.INIT_29 = 256’h_hex_value;
defparam user_instance_name.INIT_2A = 256’h_hex_value;
defparam user_instance_name.INIT_2B = 256’h_hex_value;
defparam user_instance_name.INIT_2C = 256’h_hex_value;
defparam user_instance_name.INIT_2D = 256’h_hex_value;
defparam user_instance_name.INIT_2E = 256’h_hex_value;
defparam user_instance_name.INIT_2F = 256’h_hex_value;
defparam user_instance_name.INIT_30 = 256’h_hex_value;
defparam user_instance_name.INIT_31 = 256’h_hex_value;
defparam user_instance_name.INIT_32 = 256’h_hex_value;
defparam user_instance_name.INIT_33 = 256’h_hex_value;
defparam user_instance_name.INIT_34 = 256’h_hex_value;
第四章 基於 FPGA 的預先過濾器
defparam user_instance_name.INIT_35 = 256’h_hex_value;
defparam user_instance_name.INIT_36 = 256’h_hex_value;
defparam user_instance_name.INIT_37 = 256’h_hex_value;
defparam user_instance_name.INIT_38 = 256’h_hex_value;
defparam user_instance_name.INIT_39 = 256’h_hex_value;
defparam user_instance_name.INIT_3A = 256’h_hex_value;
defparam user_instance_name.INIT_3B = 256’h_hex_value;
defparam user_instance_name.INIT_3C = 256’h_hex_value;
defparam user_instance_name.INIT_3D = 256’h_hex_value;
defparam user_instance_name.INIT_3E = 256’h_hex_value;
defparam user_instance_name.INIT_3F = 256’h_hex_value;
defparam user_instance_name.INIT_A = bit_value;
defparam user_instance_name.INIT_B = bit_value;
defparam user_instance_name.INITP_00 = 256’h_hex_value;
defparam user_instance_name.INITP_01 = 256’h_hex_value;
defparam user_instance_name.INITP_02 = 256’h_hex_value;
defparam user_instance_name.INITP_03 = 256’h_hex_value;
defparam user_instance_name.INITP_04 = 256’h_hex_value;
defparam user_instance_name.INITP_05 = 256’h_hex_value;
defparam user_instance_name.INITP_06 = 256’h_hex_value;
defparam user_instance_name.INITP_07 = 256’h_hex_value;
defparam user_instance_name.SRVAL_A = bit_value;
defparam user_instance_name.SRVAL_B = bit_value;
defparam user_instance_name.WRITE_MODE_A = string_value;
defparam user_instance_name.WRITE_MODE_B = string_value;
上述中,正體字為宣告式,固定不變;斜體字為使用者所設定之變數或
第四章 基於 FPGA 的預先過濾器
defparam user_instance_name.INIT_00 = 256’h_hex_value;
defparam user_instance_name.INIT_01 = 256’h_hex_value;
defparam user_instance_name.INIT_02 = 256’h_hex_value;
defparam user_instance_name.INIT_03 = 256’h_hex_value defparam user_instance_name.INIT_04 = 256’h_hex_value;
defparam user_instance_name.INIT_05 = 256’h_hex_value;
defparam user_instance_name.INIT_06 = 256’h_hex_value;
defparam user_instance_name.INIT_07 = 256’h_hex_value;
defparam user_instance_name.INIT_08 = 256’h_hex_value;
defparam user_instance_name.INIT_09 = 256’h_hex_value;
defparam user_instance_name.INIT_0A = 256’h_hex_value;
defparam user_instance_name.INIT_0B = 256’h_hex_value;
defparam user_instance_name.INIT_0C = 256’h_hex_value;
defparam user_instance_name.INIT_0D = 256’h_hex_value;
defparam user_instance_name.INIT_0E = 256’h_hex_value;
defparam user_instance_name.INIT_0F = 256’h_hex_value;
defparam user_instance_name.INIT_10 = 256’h_hex_value;
defparam user_instance_name.INIT_11 = 256’h_hex_value;
defparam user_instance_name.INIT_12 = 256’h_hex_value;
defparam user_instance_name.INIT_13 = 256’h_hex_value;
defparam user_instance_name.INIT_14 = 256’h_hex_value;
defparam user_instance_name.INIT_15 = 256’h_hex_value;
defparam user_instance_name.INIT_16 = 256’h_hex_value;
defparam user_instance_name.INIT_17 = 256’h_hex_value;
defparam user_instance_name.INIT_18 = 256’h_hex_value;
defparam user_instance_name.INIT_19 = 256’h_hex_value;
defparam user_instance_name.INIT_1A = 256’h_hex_value;
defparam user_instance_name.INIT_1B = 256’h_hex_value;
defparam user_instance_name.INIT_1C = 256’h_hex_value;
defparam user_instance_name.INIT_1D = 256’h_hex_value;
defparam user_instance_name.INIT_1E = 256’h_hex_value;
defparam user_instance_name.INIT_1F = 256’h_hex_value;
defparam user_instance_name.INIT_20 = 256’h_hex_value;
defparam user_instance_name.INIT_21 = 256’h_hex_value;
defparam user_instance_name.INIT_22 = 256’h_hex_value;
defparam user_instance_name.INIT_23 = 256’h_hex_value;
defparam user_instance_name.INIT_24 = 256’h_hex_value;
defparam user_instance_name.INIT_25 = 256’h_hex_value;
defparam user_instance_name.INIT_26 = 256’h_hex_value;
defparam user_instance_name.INIT_27 = 256’h_hex_value;
defparam user_instance_name.INIT_28 = 256’h_hex_value;
defparam user_instance_name.INIT_29 = 256’h_hex_value;
defparam user_instance_name.INIT_2A = 256’h_hex_value;
defparam user_instance_name.INIT_2B = 256’h_hex_value;
defparam user_instance_name.INIT_2C = 256’h_hex_value;
defparam user_instance_name.INIT_2D = 256’h_hex_value;
defparam user_instance_name.INIT_2E = 256’h_hex_value;
defparam user_instance_name.INIT_2F = 256’h_hex_value;
defparam user_instance_name.INIT_30 = 256’h_hex_value;
第四章 基於 FPGA 的預先過濾器
defparam user_instance_name.INIT_31 = 256’h_hex_value;
defparam user_instance_name.INIT_32 = 256’h_hex_value;
defparam user_instance_name.INIT_33 = 256’h_hex_value;
defparam user_instance_name.INIT_34 = 256’h_hex_value;
defparam user_instance_name.INIT_35 = 256’h_hex_value;
defparam user_instance_name.INIT_36 = 256’h_hex_value;
defparam user_instance_name.INIT_37 = 256’h_hex_value;
defparam user_instance_name.INIT_38 = 256’h_hex_value;
defparam user_instance_name.INIT_39 = 256’h_hex_value;
defparam user_instance_name.INIT_3A = 256’h_hex_value;
defparam user_instance_name.INIT_3B = 256’h_hex_value;
defparam user_instance_name.INIT_3C = 256’h_hex_value;
defparam user_instance_name.INIT_3D = 256’h_hex_value;
defparam user_instance_name.INIT_3E = 256’h_hex_value;
defparam user_instance_name.INIT_3F = 256’h_hex_value;
defparam user_instance_name.INIT_A = bit_value;
defparam user_instance_name.INIT_B = bit_value;
defparam user_instance_name.INITP_00 = 256’h_hex_value;
defparam user_instance_name.INITP_01 = 256’h_hex_value;
defparam user_instance_name.INITP_02 = 256’h_hex_value;
defparam user_instance_name.INITP_03 = 256’h_hex_value;
defparam user_instance_name.INITP_04 = 256’h_hex_value;
defparam user_instance_name.INITP_05 = 256’h_hex_value;
defparam user_instance_name.INITP_06 = 256’h_hex_value;
defparam user_instance_name.INITP_07 = 256’h_hex_value;
defparam user_instance_name.SRVAL_A = bit_value;
defparam user_instance_name.SRVAL_B = bit_value;
defparam user_instance_name.WRITE_MODE_A = string_value;
defparam user_instance_name.WRITE_MODE_B = string_value;
上述中,正體字為宣告式,固定不變;斜體字為使用者所設定之變數或
第四章 基於 FPGA 的預先過濾器
值,並且以十六進制儲存之,總共產生 64K 個位元(4 個 BlockRAM,其後會說 明為何隨機產生的文字檔大小是 4 個 BlockRAM)。在設計測試文字檔(圖-4.1 中 的 Text File 區塊)儲存方式時,我們須將搜尋視窗的參數 k 列入考慮。
我 們 此 次 的 研 究 是 將 預 先 過 濾 器 的 搜 尋 視 窗 長 度 (m) 設 定 為 10( 因 為 ClamAV 所釋放出的公開病毒碼中,最短長度為 10 個位元組),搜尋視窗所設定 區塊大小(k)為 4,這告訴了我們,預先過濾器每一次操作都是觀看搜尋視窗後 4 個位元組。因此,預先過濾器須有能力在一次的讀取時間內能同時餵入屬於現搜 尋視窗中的後 4 個位元組。而驗證器(由 AC 演算法為實作主軸)的運作模式為當 執行時,它每一次都需要讀取 1 個位元組,根據此位元組與現在狀態去決定下次 所停留的狀態。
總觀上述,我們所實現的測試文字檔必須滿足可同時讀取 4 個位元組與每一 次讀取 1 個位元組的操作模式,因此我們選擇 BlockRAM 的宣告型態為
總觀上述,我們所實現的測試文字檔必須滿足可同時讀取 4 個位元組與每一 次讀取 1 個位元組的操作模式,因此我們選擇 BlockRAM 的宣告型態為