




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Modsecurity調(diào)研報(bào)告郭川2012年2月13日醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)調(diào)研目的 分析Modsecurity模塊作為Apache框架下的一個(gè)規(guī)則引擎的執(zhí)行流程,以期在Nginx下實(shí)現(xiàn)具有類似功能的規(guī)則引擎模塊醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)內(nèi)容n Modsecurity執(zhí)行流程n Modsecurity移植問(wèn)題n 重要函數(shù)流程圖醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Modsecurity執(zhí)行流程讀取規(guī)則、翻譯規(guī)則、規(guī)則生效簡(jiǎn)介規(guī)則格式、指令哈希表、規(guī)則引擎介紹讀取規(guī)則、翻譯規(guī)則、規(guī)則生效詳解醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)讀取規(guī)則 時(shí)間:Apache啟動(dòng)
2、階段 位置:配置文件,例如 httpd.conf 中 存儲(chǔ)數(shù)據(jù)結(jié)構(gòu):配置樹,數(shù)據(jù)結(jié)構(gòu)選擇樹是由配置文件中的配置信息結(jié)構(gòu)決定的醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)翻譯規(guī)則 時(shí)間:Apache啟動(dòng)階段,讀取配置文件后 方法:利用規(guī)則引擎(規(guī)則引擎是 Modsecurity 模塊添加的一個(gè)鉤子函數(shù)建立的) 存儲(chǔ)結(jié)構(gòu):Modsecurity 模塊中定義了存儲(chǔ)一條及多條規(guī)則的結(jié)構(gòu)體 結(jié)果:構(gòu)建了存儲(chǔ)多條可使用的規(guī)則的結(jié)構(gòu)體醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則生效 時(shí)間:Apache 讀取、處理以及響應(yīng)請(qǐng)求過(guò)程中的某一點(diǎn)(Modsecurity 模塊注冊(cè)了鉤子函數(shù)的地方) 過(guò)程:根據(jù)翻譯好的規(guī)
3、則,進(jìn)行匹配檢查 結(jié)果:若匹配,則執(zhí)行規(guī)則中的相應(yīng)動(dòng)作醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則格式一條規(guī)則實(shí)例:SecRule REMOTE_ADDR 05$ redirect:其中SecRule是指令名稱,其后所跟是該指令的參數(shù)。Modsecurity 定義的指令有60多條,并且各條指令的參數(shù)格式不同。指令(Directives)舉例:SecAction;SecDefaultAction;SecMarker;SecRuleEngine;SecRule;SecRuleInheritance;SecRequestBodyAccess 醫(yī)學(xué)-modsecurity調(diào)研工作
4、匯報(bào)規(guī)則格式SecRule 的參數(shù)格式如下:SecRule VARIABLES OPERATOR TRANSFORMATION_FUNCTIONS, ACTIONSVARIABLES舉例:QUERY_STRING; REMOTE_ADDR; REQUEST_BODY OPERATOR舉例:rx; eq; ge; gt; le; lt TRANSFORMATION_FUNCTIONS舉例: lowercase; urlDecode; removeWhitespace ACTIONS舉例:allow; msg; id; deny; phase; skip; chain 醫(yī)學(xué)-modsecurity
5、調(diào)研工作匯報(bào)指令哈希表Apache 的每一個(gè)模塊都有自己定義的指令數(shù)組指令數(shù)組在模塊被添加的時(shí)候被 Apache 保存所有的指令被 Apache 保存在指令哈希表中。利用這個(gè)哈希表,由指令名字可以快速獲取到Apache中保存的關(guān)于該條指令的一個(gè)結(jié)構(gòu)體醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)指令哈希表 指令哈希表是在 Apache 啟動(dòng)階段加載模塊的過(guò)程中通過(guò)讀取模塊定義的指令數(shù)組建立的存儲(chǔ)指令的哈希表 Modsecurity模塊的定義:module AP_MODULE_DECLARE_DATA security2_module = STANDARD20_MODULE_STUFF, create
6、_directory_config, merge_directory_configs, NULL, /* create_server_config */ NULL, /* merge_server_configs */ module_directives, register_hooks;其中,moduel_directives 是 Modsecurity 模塊定義的指令數(shù)組。醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)哈希表結(jié)構(gòu)體哈希表結(jié)構(gòu)體哈希表元素結(jié)構(gòu)體哈希表元素結(jié)構(gòu)體模塊鏈結(jié)構(gòu)體模塊鏈結(jié)構(gòu)體模塊結(jié)構(gòu)體模塊結(jié)構(gòu)體指令哈希表指令哈希表ap_conf_hash指令存儲(chǔ)結(jié)構(gòu)體指令存儲(chǔ)結(jié)構(gòu)體醫(yī)學(xué)-mo
7、dsecurity調(diào)研工作匯報(bào)建立規(guī)則引擎時(shí)間:讀取規(guī)則之后,解析規(guī)則之前使用Modsecurity的鉤子函數(shù)hook_pre_configSecRule的語(yǔ)法也即其參數(shù)格式如下: SecRule VARIABLES OPERATOR TRANSFORMATION_FUNCTIONS, ACTIONS將VARIABLES OPERATOR TRANSFORMATION_FUNCTIONS ACTIONS 四個(gè)域?qū)?yīng)的所有可選值存儲(chǔ)到一個(gè)類型為msc_egine的結(jié)構(gòu)體中,這個(gè)結(jié)構(gòu)體就稱為規(guī) 則引擎。醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則引擎規(guī)則引擎modsecurity模塊引擎結(jié)構(gòu)體模塊
8、引擎結(jié)構(gòu)體規(guī)則引擎結(jié)構(gòu)體規(guī)則引擎結(jié)構(gòu)體規(guī)則變換函數(shù)結(jié)構(gòu)體規(guī)則變換函數(shù)結(jié)構(gòu)體規(guī)則變量結(jié)構(gòu)體規(guī)則變量結(jié)構(gòu)體規(guī)則操作符結(jié)構(gòu)體規(guī)則操作符結(jié)構(gòu)體規(guī)則動(dòng)作結(jié)構(gòu)體規(guī)則動(dòng)作結(jié)構(gòu)體醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)讀取規(guī)則讀取配置文件中的每條配置信息,形成一顆配置樹結(jié)構(gòu)。配置樹中結(jié)點(diǎn)結(jié)構(gòu)如下:配置樹中指令結(jié)點(diǎn)結(jié)構(gòu)體配置樹中指令結(jié)點(diǎn)結(jié)構(gòu)體醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)讀取規(guī)則配置樹:醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)配置樹配置樹ap_conftree配置樹中指令結(jié)點(diǎn)結(jié)構(gòu)體配置樹中指令結(jié)點(diǎn)結(jié)構(gòu)體遍歷配置樹并執(zhí)行每個(gè)結(jié)點(diǎn)中的指令的過(guò)程遍歷配置樹并執(zhí)行每個(gè)結(jié)點(diǎn)中的指令的過(guò)程讀取規(guī)則醫(yī)學(xué)-modse
9、curity調(diào)研工作匯報(bào)翻譯規(guī)則遍歷配置樹中的每一條規(guī)則根據(jù)規(guī)則名稱查找指令哈希表執(zhí)行指令結(jié)構(gòu)中的相應(yīng)函數(shù)指令哈希表中的指令哈希表中的指令存儲(chǔ)結(jié)構(gòu)指令存儲(chǔ)結(jié)構(gòu)SecRule指令的存儲(chǔ)結(jié)構(gòu),相應(yīng)的函數(shù)即指令的存儲(chǔ)結(jié)構(gòu),相應(yīng)的函數(shù)即cmd_rule()醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)翻譯規(guī)則cmd_rule() 函數(shù) 利用規(guī)則引擎翻譯規(guī)則,并保存翻譯后的規(guī)則規(guī)則解釋好以后,被存儲(chǔ)到Modsecurity模塊定義的規(guī)則結(jié)構(gòu)體(msre_rule)中,所有的規(guī)則都存儲(chǔ)到規(guī)則集結(jié)構(gòu)體中(msre_ruleset)中cmd_rule()函數(shù)是Modsecurity模塊中最重要的兩個(gè)函數(shù)之一,另一個(gè)
10、是modsecurity_process_phase()醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)翻譯規(guī)則規(guī)則舉例:SecRule REMOTE_ADDR 05$ redirect: 使用REMOTE_ADDR從規(guī)則庫(kù)中取出相應(yīng)的msre_var_metadata 類型的變量結(jié)構(gòu)體:規(guī)則變量結(jié)構(gòu)體的定義規(guī)則變量結(jié)構(gòu)體的定義存儲(chǔ)變量存儲(chǔ)變量REMOTE_ADDR的結(jié)構(gòu)體的結(jié)構(gòu)體醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)翻譯規(guī)則使用“05$” 從規(guī)則庫(kù)中取出類型為msre_op_metadata類型的操作符結(jié)構(gòu)體:使用“redirect: ” 從規(guī)則庫(kù)中取出
11、類型為msre_action_metadata類型的動(dòng)作結(jié)構(gòu)體:規(guī)則操作符結(jié)構(gòu)體規(guī)則操作符結(jié)構(gòu)體規(guī)則操作符結(jié)構(gòu)體實(shí)例規(guī)則操作符結(jié)構(gòu)體實(shí)例規(guī)則動(dòng)作規(guī)則動(dòng)作結(jié)構(gòu)體結(jié)構(gòu)體規(guī)則動(dòng)作結(jié)構(gòu)體實(shí)例規(guī)則動(dòng)作結(jié)構(gòu)體實(shí)例醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)翻譯規(guī)則規(guī)則翻譯的步驟:規(guī)則庫(kù)中存儲(chǔ)msre_var | op | tfn | action_metadata 類型的結(jié)構(gòu)體根據(jù)規(guī)則中的具體變量名從規(guī)則庫(kù)中取到對(duì)應(yīng)的結(jié)構(gòu)體將一條規(guī)則的相關(guān)信息存儲(chǔ)到一個(gè)規(guī)則結(jié)構(gòu)體中將所有規(guī)則按照?qǐng)?zhí)行階段的不同存儲(chǔ)到一個(gè)規(guī)則集結(jié)構(gòu)體中醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則集和規(guī)則規(guī)則集和規(guī)則醫(yī)學(xué)-modsecurity調(diào)
12、研工作匯報(bào)*規(guī)則存儲(chǔ)規(guī)則存儲(chǔ)*規(guī)則集動(dòng)作規(guī)則變量動(dòng)作集醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)動(dòng)作和動(dòng)作集動(dòng)作和動(dòng)作集醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則生效時(shí)間:在Apache處理請(qǐng)求的過(guò)程中,添加鉤子函數(shù),Modsecurity 的鉤子函數(shù)中使用規(guī)則對(duì)請(qǐng)求進(jìn)行處理過(guò)程:變量決定數(shù)據(jù)操作符決定匹配動(dòng)作決定去向首先生成具體變量,其次根據(jù)操作符進(jìn)行匹配,若匹配成功,則完成相應(yīng)動(dòng)作。醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則生效規(guī)則被解釋后得到的規(guī)則結(jié)構(gòu)體中存儲(chǔ)著各個(gè)域?qū)?yīng)的結(jié)構(gòu)體,結(jié)構(gòu)體中存儲(chǔ)相應(yīng)的函數(shù)指針使用如下規(guī)則詳細(xì)解釋SecRule REMOTE_ADDR 192.168.1.
13、105$ redirect: 醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)SecRule REMOTE_ADDR 05$ redirect: 變量變量REMOTE_ADDR對(duì)應(yīng)的結(jié)構(gòu)體,其中函數(shù)對(duì)應(yīng)的結(jié)構(gòu)體,其中函數(shù)var_romote_addr_generate的作用是獲得訪問(wèn)端的作用是獲得訪問(wèn)端ip地址并保存。地址并保存。函數(shù)將函數(shù)將modsec_rec類型結(jié)構(gòu)體中類型結(jié)構(gòu)體中remote_addr的的值保存到值保存到mare_var類型的結(jié)構(gòu)體中。類型的結(jié)構(gòu)體中。例子中變量域?yàn)槔又凶兞坑驗(yàn)椤盧EMOTE_ADDR”醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)SecRule
14、 REMOTE_ADDR 05$ redirect: 例子中操作符域?yàn)槔又胁僮鞣驗(yàn)?5$默認(rèn)操作符為默認(rèn)操作符為“rx”,及正則表達(dá)式匹配方式,函數(shù),及正則表達(dá)式匹配方式,函數(shù)msre_op_rx_execute將操將操作符的參數(shù)(此例中參數(shù)為作符的參數(shù)(此例中參數(shù)為05 )與已獲得的變量相匹配,并返回)與已獲得的變量相匹配,并返回匹配結(jié)果標(biāo)識(shí)。匹配結(jié)果標(biāo)識(shí)。醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)SecRule REMOTE_ADDR 05$ redirect: 規(guī)則動(dòng)作結(jié)構(gòu)體實(shí)例,函數(shù)規(guī)則動(dòng)作結(jié)構(gòu)體
15、實(shí)例,函數(shù)msre_action_redirect_validate檢驗(yàn)參數(shù)是否合法;檢驗(yàn)參數(shù)是否合法;msre_action_redirect_execute函數(shù)將從定向地址賦給函數(shù)將從定向地址賦給rule-actionset-intercept_uri例子中動(dòng)作域?yàn)槔又袆?dòng)作域?yàn)閞edirect: 醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)重要結(jié)構(gòu)體總結(jié)規(guī)則引擎:msc_engine; msre_engine; msre_var_metadata; msre_op_metadata; msre_tfn_metadata; msre_action_metadata;規(guī)則使用:modsec_re
16、c; directory_rec; msre_ruleset; msre_rule; msre_var;msre_actionset; msre_action; 醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)執(zhí)行流程總結(jié)加載模塊,讀取指令數(shù)組,建立指令哈希表讀取配置文件中的規(guī)則,建立配置樹一個(gè)掛鉤函數(shù),建立規(guī)則庫(kù)處理配置樹,查詢指令哈希表,使用規(guī)則庫(kù)翻譯規(guī)則處理請(qǐng)求,執(zhí)行鉤子函數(shù),匹配規(guī)則醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)移植問(wèn)題modsecurity規(guī)則集的維護(hù)獨(dú)立作為另外一個(gè)項(xiàng)目,網(wǎng)址如下:移植的modsecurity應(yīng)至少能翻譯最小規(guī)則集(Rules Language Porting S
17、pec)中的規(guī)則。實(shí)現(xiàn)nginx下的規(guī)則引擎主要參考apache下modsecurity的實(shí)現(xiàn)。醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)移植問(wèn)題將modsecurity模塊從apache下移植到nginx下需要注意的問(wèn)題是modsecurity中與apache有聯(lián)系的部分,modsecurity獨(dú)立實(shí)現(xiàn)部分直接復(fù)制就行。modsecurityapacheapache+modsecurity中間相互關(guān)聯(lián)的一部分是移植過(guò)程中應(yīng)該重點(diǎn)考慮的地方在apache框架下實(shí)現(xiàn)的規(guī)則引擎醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)移植問(wèn)題模塊定義: apache通過(guò)加載模塊來(lái)使用modsecurity實(shí)現(xiàn)的規(guī)則解
18、釋功能,定義模塊結(jié)構(gòu)體可以看做是定義apache核心和modsecurity所實(shí)現(xiàn)功能的一個(gè)接口,加載模塊的過(guò)程就是apache了解模塊實(shí)現(xiàn)哪些功能的過(guò)程醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Apache中定義模塊的結(jié)構(gòu)體中定義模塊的結(jié)構(gòu)體Nginx中定義模塊的結(jié)構(gòu)體中定義模塊的結(jié)構(gòu)體Apache和和nginx中中模塊結(jié)構(gòu)體比較模塊結(jié)構(gòu)體比較醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)移植問(wèn)題讀取、處理配置信息:需要將apache和nginx讀取、處理配置信息的方式作比較規(guī)則存儲(chǔ)在配置文件中,apache讀取配置文件過(guò)程中,將每一條規(guī)則作為一條獨(dú)立的配置信息醫(yī)學(xué)-modsecurity調(diào)研工作匯
19、報(bào)Apache 配置信息的存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)圖解醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Structure of the perrequest configuration processor: The walk procedures醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)移植問(wèn)題規(guī)則生效:各個(gè)域?qū)?yīng)的結(jié)構(gòu)體中有相應(yīng)的函數(shù),在函數(shù)的執(zhí)行過(guò)程中會(huì)用到apache中的一些數(shù)據(jù),此時(shí)就需要使用保存的apache數(shù)據(jù)。規(guī)則操作符結(jié)構(gòu)體實(shí)例規(guī)則操作符結(jié)構(gòu)體實(shí)例規(guī)則動(dòng)作結(jié)構(gòu)體實(shí)例規(guī)則動(dòng)作結(jié)構(gòu)體實(shí)例規(guī)則變量結(jié)構(gòu)體實(shí)例規(guī)則變量結(jié)構(gòu)體實(shí)例醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)移植問(wèn)題規(guī)則生效:modsecurity首
20、先獲取將會(huì)用到的apache中的數(shù)據(jù),存儲(chǔ)到類型為modsec_rec類型的結(jié)構(gòu)體中,等到modsecurity中的函數(shù)需要時(shí)直接從此結(jié)構(gòu)體中取到此結(jié)構(gòu)體是modsecurity中最重要的兩個(gè)結(jié)構(gòu)體之一;另一個(gè)之一類型為directory_config,用于apache處理配置信息的過(guò)程中醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)request_recmodsec_recmsre_rulesetdirectory_configserver_recnoteslookup_defaultApache和和Modsecurity交互交互過(guò)程中的主要結(jié)構(gòu)體過(guò)程中的主要結(jié)構(gòu)體Apache結(jié)構(gòu)體結(jié)構(gòu)體醫(yī)學(xué)-m
21、odsecurity調(diào)研工作匯報(bào)*規(guī)則存儲(chǔ)規(guī)則存儲(chǔ)*規(guī)則集動(dòng)作規(guī)則變量動(dòng)作集醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)重要函數(shù)流程圖 規(guī)則添加函數(shù)(規(guī)則翻譯函數(shù))及規(guī)則生效函數(shù)流程圖 hook_request_early 、hook_request_late 、output_filter 三個(gè)函數(shù)的流程圖醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)規(guī)則添加函數(shù)(規(guī)則翻譯函數(shù))及規(guī)則生效函數(shù)流程圖醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Apache2_config.c, Line 615;add_rule;Line 629; dcfg-ruleset = msre_ruleset_create(mod
22、security-msre, cmd-pool);/*Create a ruleset if one does not exist.*/Line 653; dcfg-tmp_default_actionset = msre_actionset_create_default(modsecurity-msre);/*Create default actionset if one does not already exist.*/Line 660; if (rule-actionset != NULL) & (dcfg-tmp_chain_starter != NULL);/*Check synta
23、x for chained rules.*/Line 702; rule-actionset = msre_actionset_merge(modsecurity-msre, dcfg-tmp_default_actionset, rule-actionset, 1);/*Check syntax for chained rules.*/Line 720; if (dcfg-tmp_chain_starter != NULL);/*如果規(guī)則屬于某規(guī)則鏈,則設(shè)置鏈頭.*/規(guī)則添加流程圖規(guī)則添加流程圖醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Apache2_config.c, Line 615;ad
24、d_rule;Line 725; if (rule-actionset-is_chained != 1); /*檢查規(guī)則鏈中的一條規(guī)則是否還要繼續(xù)連接此規(guī)則鏈.*/Line 748; if (dcfg-tmp_rule_placeholders = NULL); dcfg-tmp_rule_placeholders = apr_table_make(cmd-pool, 10);/*Create skip table if one does not already exist.*/Line 753; if (rule-actionset-skip_after != NOT_SET_P); apr
25、_table_setn(dcfg-tmp_rule_placeholders, tmp_id, tmp_id);/*Keep track of any rule IDs we need to skip after.*/Line 776; if (rule-actionset-id != NULL) & apr_table_get(dcfg-tmp_rule_placeholders, rule-actionset-id);/*檢查當(dāng)前添加規(guī)則的編號(hào)是否存在于數(shù)組dcfg-tmp_rule_placeholders中,若存在,則添加此規(guī)則后,數(shù)組中的編號(hào)即失效.*/規(guī)則添加流程圖規(guī)則添加流程圖醫(yī)
26、學(xué)-modsecurity調(diào)研工作匯報(bào)modsecurity.c, Line 659; modsecurity_process_phase;Line 661;if (msr-was_intercepted)&(phase != PHASE_LOGGING);/*Check if we should run.*/Line 670;if (msr-phase = phase);/*Do not process the same phase twice.*/Line 682;if (msr-txcfg-cache_trans = MODSEC_CACHE_ENABLED); /*Clear out
27、the transformation cache at the start of each phase.*/Line 743; switch(phase); /*這一步是重點(diǎn)。這一步是重點(diǎn)。根據(jù)當(dāng)前所處的階段phase,選擇調(diào)用哪一個(gè)處理函數(shù).*/規(guī)則生效流程圖規(guī)則生效流程圖1醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)modsecurity.c, Line 459; modsecurity_process_phase_request_headers;Line 463;if (msr-txcfg-debuglog_level = 4);/*檢查是否需要記錄日志.*/Line 467;time_be
28、fore = apr_time_now();/*記錄開始時(shí)間.*/Line 469;if (msr-txcfg-ruleset != NULL);/*這一步是重點(diǎn)。這一步是重點(diǎn)。 檢查規(guī)則集是否為空,若不為空,調(diào)用規(guī)則集處理函數(shù)msre_ruleset_process_phase.*/Line 473; msr-time_phase1 = apr_time_now() - time_before;/*計(jì)算此階段規(guī)則集處理所花費(fèi)時(shí)間,結(jié)束時(shí)間減去開始時(shí)間.*/規(guī)則生效流程圖規(guī)則生效流程圖2醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)re.c, Line 1078;msre_ruleset_proce
29、ss_phase;Line 1089; switch (msr-phase);/*獲取當(dāng)前階段的規(guī)則集.*/Line 1122; for (i = 0; i nelts; i+);/*循環(huán)遍歷當(dāng)前階段規(guī)則集中的所有規(guī)則.*/Line 1134; if (mode = SKIP_RULES);/*是否有skipAfter動(dòng)作.*/Line 1189; if (mode = NEXT_CHAIN)/*規(guī)則鏈中有規(guī)則不匹配,則跳出此鏈.*/Line 1203; if (mode = NEXT_RULE)&(skip 0);/*/Line 1223; if(apr_is_empty_array(msr
30、-removed_rules_tag)=0);/*Check if this rule was removed at runtime.*/Line 1300; if(msr-txcfg-is_enabled = MODSEC_DISABLED);Line 1336; rc = msre_rule_process(rule, msr);/*重點(diǎn)。重點(diǎn)。 經(jīng)過(guò)一系列的檢查,最終調(diào)用規(guī)則處理函數(shù).*/Line 1346; if (rc = RULE_NO_MATCH); /*后續(xù)處理.*/規(guī)則生效流程圖規(guī)則生效流程圖3醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)re.c, Line 2849; msre
31、_rule_process;Line 2851;if (msr-msc_rule_mptmp = NULL);/*處理每條規(guī)則時(shí)使用新的內(nèi)存地址空間(新的子內(nèi)存池),在這里創(chuàng)建新內(nèi)存 Use a fresh memory sub-pool for processing each rule.*/Line 2865;msre_rule_process_normal(rule, msr);/*重點(diǎn)。重點(diǎn)。 調(diào)用真正的規(guī)則處理函數(shù).Executes rule against the given transaction.*/規(guī)則生效流程圖規(guī)則生效流程圖4醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)re.c,
32、 Line 2271;msre_rule_process_normal;Line 2303; for (i = 0; i targets-nelts; i+);/*處理變量域并保存其值。Expand variables to create a list of targets.*/Line 2371; if (msr-txcfg-cache_trans != MODSEC_CACHE_DISABLED);/*Is this var cacheable?*/Line 2337; if (msr-txcfg-debuglog_level = 4);/*記錄變量處理的日志。Log the target
33、 variable expansion.*/Line 2360; for (i = 0; i nelts; i+);/*遍歷前面已經(jīng)保存的生成的變量,針對(duì)每一次遍歷:執(zhí)行變換操作;并調(diào)用操作符函數(shù)execute_operator。Loop through targets on the final target list, perform transformations as necessary, and invoke the operator.*/Line 2784;rc = execute_operator(var, rule, msr, acting_actionset, mptmp);
34、/*重點(diǎn)。重點(diǎn)。Execute operator.*/Line 2469; /*Transform target.*/規(guī)則生效流程圖規(guī)則生效流程圖5醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)re.c, Line 2120;execute_operator;Line 2136; if (var-param != NULL) & (var-name != NULL) & (strchr(var-name,:) = NULL);/*確定完整變量名稱*/Line 2167; rc = rule-op_metadata-execute(msr, rule, var, &my_error_msg);/*De
35、tect whether variable and operator matches?*/Line 2255; msre_perform_nondisruptive_actions(msr, rule, rule-actionset, mptmp);/*根據(jù)操作符函數(shù)匹配的結(jié)果執(zhí)行非中斷性的動(dòng)作.*/Line 2261; msre_perform_disruptive_actions(msr, rule, acting_actionset, mptmp, my_error_msg);/*執(zhí)行中斷性動(dòng)作,但要求該規(guī)則不屬于規(guī)則鏈*/規(guī)則生效流程圖規(guī)則生效流程圖6醫(yī)學(xué)-modsecurity調(diào)研工
36、作匯報(bào)hook_request_early 、hook_request_late、output_filter 三個(gè)函數(shù)的流程圖醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)mod_security2.c, Line 638; hook_request_early; /*初始化請(qǐng)求處理,在apache接收到請(qǐng)求頭后馬上執(zhí)行。這個(gè)函數(shù)會(huì)創(chuàng)建新的modsec_rec類型結(jié)構(gòu)體。*/Line 639; modsec_rec *msr = NULL;/*定義空的類型為modsec_rec的結(jié)構(gòu)體變量。*/Line 651; msr = create_tx_context(r); /*初始化交易上下文并建立初始
37、配置信息。這里是重點(diǎn)。這里是重點(diǎn)。初始化結(jié)構(gòu)體msr。見下一頁(yè)。*/hook_request_early1醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)mod_security2.c, Line 350; create_tx_context;Line 367; msr-dcfg1 = (directory_config *)ap_get_module_config(r-per_dir_config, &security2_module); /*獲取apache中保存的關(guān)于此模塊的配置信息*/Line 388; msr-txcfg = merge_directory_configs(msr-mp, m
38、sr-txcfg, msr-dcfg1);/*合并配置信息結(jié)構(gòu)體*/Line 391; init_directory_config(msr-txcfg); /*設(shè)置配置結(jié)構(gòu)體的初始默認(rèn)值*/Line 426; if (modsecurity_tx_init(msr) txid = get_env_var(r, “UNIQUE_ID”); /*獲取命名的環(huán)境變量*/Line 431; store_tx_context(msr, r);/*保存交易上下文到r-notes字段中: Line 344; apr_table_setn(r-notes, NOTE_MSR, (void *)msr);*/醫(yī)
39、學(xué)-modsecurity調(diào)研工作匯報(bào)modsecurity.c, Line 267; modsecurity_tx_init;hook_request_early3Line 277-281; /* 設(shè)置C-L(Content-Length) */Line 284-296; /* 檢查此請(qǐng)求是否存在請(qǐng)求體*/Line 299-301; /* 設(shè)置C-T (Content-Type) */Line 337-340; /* 檢查是否必須緩沖,若是則只是用內(nèi)存。*/Line 304-334; /* 確定針對(duì)請(qǐng)求體的操作。挺重要的。挺重要的。*/Line 380-390; /* 找到cookie he
40、aders 并解析*/Line 343-359; /* 設(shè)置參數(shù)。在ARGS變量處理函數(shù)中會(huì)用到。*/Line 348; 函數(shù)parse_arguments(); /*解析參數(shù)并存儲(chǔ)*/醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)mod_security2.c, Line 676; hook_request_late;Line 738-746; /* REQUEST_HEADERS處理階段 */hook_request_late1Line 691; msr = retrieve_tx_context(r); /* 取得交易上下文*/Line 709; msr-dcfg2 = (directory_
41、config *)ap_get_module_config(r-per_dir_config, &security2_module); /* 取得第二個(gè)配置信息*/Line 713; msr-txcfg = create_directory_config(msr-mp, NULL);/* 創(chuàng)建交易上下文*/Line 721; msr-txcfg = merge_directory_configs(msr-mp, msr-txcfg, msr-usercfg);/* 更新默認(rèn)的用戶設(shè)置*/Line 723; init_directory_config(msr-txcfg); /* 初始化配置結(jié)構(gòu)
42、體 */醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 765-789; /* 檢查請(qǐng)求體是否過(guò)長(zhǎng)*/Line 799-843; /* 調(diào)用讀取請(qǐng)求體的函數(shù)read_request_body(),并檢查返回結(jié)果 */Line 792-797; /* 確定是否提取多重文件*/Line 854; msr-request_headers = apr_table_copy(msr-mp, r-headers_in);/* 更新請(qǐng)求頭*/Line 857-867; /* REQUEST_BODY處理階段 */Line 872-875; /* 只有當(dāng)后臺(tái)需要時(shí)才移除客戶端設(shè)置的壓縮標(biāo)識(shí)。*/Line 7
43、49-755; /* 檢查在階段一中是否有禁用規(guī)則引擎*/mod_security2.c, Line 676; hook_request_late;hook_request_late2醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 189; bb_in = apr_brigade_create(msr-mp, r-connection-bucket_alloc); /* */Line 194; rc = ap_get_brigade(r-input_filters, bb_in, AP_MODE_READBYTES, APR_BLOCK_READ, HUGE_STRING_LEN); /*使
44、用注冊(cè)的input_filter中的處理函數(shù) ,如ap_http_filter。*/apache2_io.c, Line 157; read_request_body;hook_request_late3.1Line 166; if (msr-reqbody_should_exist != 1) ; /*檢查是否存在請(qǐng)求體*/Line 173; if (msr-txcfg-reqbody_access != 1) ; /*檢查是否允許訪問(wèn)請(qǐng)求體*/Line 184; if (modsecurity_request_body_start(msr, error_msg) reqbody_lengt
45、h + buflen (apr_size_t)msr-txcfg-reqbody_limit) ; /* 檢查請(qǐng)求體大小限制(should only trigger on chunked requests) */Line 266; modsecurity_request_body_to_stream(msr, buf, buflen, error_msg); /* */Line 309; modsecurity_request_body_end(msr, error_msg); /* */apache2_io.c, Line 157; read_request_body;hook_reques
46、t_late3.2Line 272; int rcbs = modsecurity_request_body_store(msr, buf, buflen, error_msg);/* 重點(diǎn)。重點(diǎn)。將從請(qǐng)求體中取到的數(shù)據(jù)存儲(chǔ)到modsec_rec結(jié)構(gòu)體的相關(guān)字段中。 */Line 305; apr_brigade_cleanup(bb_in); /* */Line 228; rc = apr_bucket_read(bucket, &buf, &buflen, ); /* */醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 97; msre_reqbody_processor_metadat
47、a *metadata =; /*獲取請(qǐng)求體處理器的元數(shù)據(jù)結(jié)構(gòu)體*/Line 100-137; /*確定請(qǐng)求體處理器是否為空及其種類*/msc_reqbody.c, Line 82; modsecurity_request_body_start;/* Prepare to accept the request body (part 1). */hook_request_late3.3Line 91; apr_pool_create(&msr-msc_reqbody_mp, NULL); /*另外建立一個(gè)新的內(nèi)存池用以分配新的數(shù)據(jù)結(jié)構(gòu)(not data, which is allocated v
48、ia malloc).*/Line 95-138; if (msr-msc_reqbody_processor != NULL) ; /*初始化請(qǐng)求體處理器*/Line 140; return modsecurity_request_body_start_init(msr, error_msg); /*調(diào)用請(qǐng)求體處理的第二部分*/醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 56-74; /*為將請(qǐng)求體保存到磁盤中做準(zhǔn)備*/Line 58; msr-msc_reqbody_ = apr_psprintf(msr-mp, “%s/%s-%s-request_body-XXXXXX”, msr
49、-txcfg-tmp_dir, current_(msr-mp), msr-txid); /*確定磁盤上存儲(chǔ)請(qǐng)求體的臨時(shí)文件名*/msc_reqbody.c, Line 43; modsecurity_request_body_start_init;/* Prepare to accept the request body (part 2). */hook_request_late3.4Line 46-55; if(msr-msc_reqbody_storage = MSC_REQBODY_MEMORY) /* 為將請(qǐng)求體保存到內(nèi)存中做準(zhǔn)備*/Line 49; msr-msc_reqbody_
50、chunks = apr_array_make(msr-msc_reqbody_mp, 32, sizeof(msc_data_chunk *); /*創(chuàng)建準(zhǔn)備存儲(chǔ)請(qǐng)求體數(shù)據(jù)的內(nèi)存空間*/Line 65; msr-msc_reqbody_fd = msc_mkstemp(char *)msr-msc_reqbody_);/* 在磁盤上創(chuàng)建保存請(qǐng)求體的臨時(shí)文件*/醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 653; msr-msc_reqbody_fd = open(msr-msc_reqbody_, O_RDONLY | O_BINARY); /*打開磁盤上將要存儲(chǔ)請(qǐng)求體數(shù)據(jù)的文件*/m
51、sc_reqbody.c, Line 621; modsecurity_request_body_retrieve_start;/*Prepares to forward the request body.*/hook_request_late3.5Line 628; msr-msc_reqbody_disk_chunk = apr_pcalloc(msr-msc_reqbody_mp, sizeof(msc_data_chunk); /*/Line 646; msr-msc_reqbody_disk_chunk-data = apr_palloc(msr-msc_reqbody_mp, CH
52、UNK_CAPACITY); /*/Line 624; if (msr-msc_reqbody_storage = MSC_REQBODY_MEMORY) ; /*判斷請(qǐng)求體是否將存儲(chǔ)在內(nèi)存中*/Line 637; if (msr-msc_reqbody_storage = MSC_REQBODY_DISK) ; /*判斷請(qǐng)求體是否將存儲(chǔ)在磁盤中*/Line 638; msr-msc_reqbody_disk_chunk = apr_pcalloc(msr-msc_reqbody_mp, sizeof(msc_data_chunk); /*/醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)msc_re
53、qbody.c, Line 687; modsecurity_request_body_retrieve;/*Returns one chunk of request body data. It stores a NULL in the chunk pointer when there is no data to return. The return code is 1 if more calls can be made to retrieve more data, 0 if there is no more data to retrieve, or -1 on error. The call
54、er can limit the amount of data returned by providing a non-negative value in nbytes. */hook_request_late3.6Line 653; if (msr-msc_reqbody_storage = MSC_REQBODY_DISK) ; Line 713-743; /*Advance to the current chunk and position on the next byte we need to send.*/Line 700; if (msr-msc_reqbody_storage =
55、 MSC_REQBODY_MEMORY) ; Line 708; *chunk = msr-msc_reqbody_disk_chunk; /*/Line 765; i = read(msr-msc_reqbody_fd, msr-msc_reqbody_disk_chunk-data, my_nbytes); Line 772; *chunk = msr-msc_reqbody_disk_chunk; 醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 373; return modsecurity_request_body_store_disk(msr, data, length, erro
56、r_msg); /*將請(qǐng)求體數(shù)據(jù)塊存儲(chǔ)到磁盤上*/msc_reqbody.c, Line 293; modsecurity_request_body_store;/* Stores one chunk of request body data. */hook_request_late3.7Line 302-360; if (msr-msc_reqbody_processor != NULL) & (msr-msc_reqbody_error = 0) /* If we have a processor for this request body send data to it first.*/
57、Line 369; return modsecurity_request_body_store_memory(msr, data, length, error_msg); /*將請(qǐng)求體數(shù)據(jù)塊存儲(chǔ)在內(nèi)存中*/醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 236-257; /*分配新的存儲(chǔ)請(qǐng)求體數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。*/msc_reqbody.c, Line 166; modsecurity_request_body_store_memory;/* Stores one chunk of request body data in memory. */hook_request_late3.9Line
58、172-215; /* 檢查需要存儲(chǔ)的請(qǐng)求體數(shù)據(jù)塊是否超出規(guī)定的限制大小.*/Line 234-282; /*while循環(huán)將請(qǐng)求體數(shù)據(jù)塊中的數(shù)據(jù)轉(zhuǎn)存儲(chǔ)在相關(guān)的數(shù)據(jù)結(jié)構(gòu)中*/Line 259-265; /*當(dāng)前數(shù)據(jù)結(jié)構(gòu)的剩余空間足夠存儲(chǔ)請(qǐng)求體數(shù)據(jù)*/Line 266-280; /*當(dāng)前數(shù)據(jù)結(jié)構(gòu)空間有限,則填充滿以后修改相關(guān)指針,并等待下次循環(huán)新建一個(gè)結(jié)構(gòu)體*/醫(yī)學(xué)-modsecurity調(diào)研工作匯報(bào)Line 626-637; /* Put back the Accept-Encoding and TE request headers if they were removed from the
59、request. */Line 640-729; if (msr-of_status = OF_STATUS_NOT_STARTED) ;/* Initialise on first invocation */Line 650; rc = modsecurity_process_phase(msr, PHASE_RESPONSE_HEADERS);/* RESPONSE_HEADERS處理階段*/Line 610-615; /* 檢查上下文內(nèi)容是否為空*/apache2_io.c, Line 602; output_filter;output_filter1Line 668-689; ap_add_output_filter(“MODSECURITY_OUT”, msr, r, r-connection);/* 確定是否需要檢查response body. */Line 692-711; /* If injecting content uns
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 情景交際用語(yǔ)課件
- 悄悄變化的我課件簡(jiǎn)介
- 幼兒園大班心臟教育活動(dòng)策劃方案
- 開學(xué)第一天主題班會(huì)活動(dòng)方案
- 小班上學(xué)期老師個(gè)人工作方案
- 電磁感應(yīng)試題及答案
- 七夕餐廳營(yíng)銷活動(dòng)方案策劃
- 定向選調(diào)面試題及答案
- 后勤管理考試題及答案
- 職業(yè)暴露試題及答案
- GB/T 4937.20-2018半導(dǎo)體器件機(jī)械和氣候試驗(yàn)方法第20部分:塑封表面安裝器件耐潮濕和焊接熱綜合影響
- GB/T 3836.1-2021爆炸性環(huán)境第1部分:設(shè)備通用要求
- GB/T 25216-2010煤與瓦斯突出危險(xiǎn)性區(qū)域預(yù)測(cè)方法
- 變壓器運(yùn)行維護(hù)手冊(cè)
- GA/T 1161-2014法庭科學(xué)DNA檢驗(yàn)鑒定文書內(nèi)容及格式
- 英語(yǔ)劇本 小王子
- 云南專升本會(huì)計(jì)試題
- 民間信仰活動(dòng)場(chǎng)所信息采集表
- 2023年版義務(wù)教育音樂課程標(biāo)準(zhǔn)(標(biāo)準(zhǔn)版)
- 神華包頭煤化工分公司2013年夏季水平衡測(cè)試報(bào)告
- 有效咳嗽技術(shù)操作評(píng)分標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論