PageRenderTime 38ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/modsecurity-apache_2.6.1/apache2/re.h

http://vulture.googlecode.com/
C Header | 402 lines | 275 code | 89 blank | 38 comment | 0 complexity | 73f4681524e7475e570611827f579d9a MD5 | raw file
Possible License(s): Apache-2.0
  1. /*
  2. * ModSecurity for Apache 2.x, http://www.modsecurity.org/
  3. * Copyright (c) 2004-2011 Trustwave Holdings, Inc. (http://www.trustwave.com/)
  4. *
  5. * You may not use this file except in compliance with
  6. * the License.  You may obtain a copy of the License at
  7. *
  8. *     http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * If any of the files related to licensing are missing or if you have any
  11. * other questions related to licensing please contact Trustwave Holdings, Inc.
  12. * directly using the email address security@modsecurity.org.
  13. */
  14. #ifndef _MSC_RE_H_
  15. #define _MSC_RE_H_
  16. #define ABSOLUTE_VALUE 0
  17. #define POSITIVE_VALUE 1
  18. #define NEGATIVE_VALUE 2
  19. typedef struct msre_ipmatch msre_ipmatch;
  20. typedef struct msre_engine msre_engine;
  21. typedef struct msre_ruleset msre_ruleset;
  22. typedef struct msre_ruleset_internal msre_ruleset_internal;
  23. typedef struct msre_rule msre_rule;
  24. typedef struct msre_var_metadata msre_var_metadata;
  25. typedef struct msre_var msre_var;
  26. typedef struct msre_op_metadata msre_op_metadata;
  27. typedef struct msre_tfn_metadata msre_tfn_metadata;
  28. typedef struct msre_actionset msre_actionset;
  29. typedef struct msre_action_metadata msre_action_metadata;
  30. typedef struct msre_action msre_action;
  31. typedef struct msre_reqbody_processor_metadata msre_reqbody_processor_metadata;
  32. typedef struct msre_cache_rec msre_cache_rec;
  33. #include "apr_general.h"
  34. #include "apr_tables.h"
  35. #include "modsecurity.h"
  36. #include "msc_pcre.h"
  37. #include "persist_dbm.h"
  38. #include "apache2.h"
  39. #include "http_config.h"
  40. #if defined(WITH_LUA)
  41. #include "msc_lua.h"
  42. #endif
  43. /* Actions, variables, functions and operator functions */
  44. char DSOLOCAL *update_rule_target(cmd_parms *cmd, directory_config *dcfg, msre_ruleset *rset, const char *p1, const char *p2, const char *p3);
  45. apr_status_t DSOLOCAL collection_original_setvar(modsec_rec *msr, const char *col_name, const msc_string *orig_var);
  46. int DSOLOCAL expand_macros(modsec_rec *msr, msc_string *var, msre_rule *rule, apr_pool_t *mptmp);
  47. msre_var_metadata DSOLOCAL *msre_resolve_var(msre_engine *engine, const char *name);
  48. msre_var DSOLOCAL *msre_create_var_ex(apr_pool_t *pool, msre_engine *engine, const char *name, const char *param,
  49. modsec_rec *msr, char **error_msg);
  50. int DSOLOCAL msre_parse_generic(apr_pool_t *pool, const char *text, apr_table_t *vartable,
  51. char **error_msg);
  52. int DSOLOCAL rule_id_in_range(int ruleid, const char *range);
  53. msre_var DSOLOCAL *generate_single_var(modsec_rec *msr, msre_var *var, apr_array_header_t *tfn_arr,
  54. msre_rule *rule, apr_pool_t *mptmp);
  55. #if defined(WITH_LUA)
  56. apr_table_t DSOLOCAL *generate_multi_var(modsec_rec *msr, msre_var *var, apr_array_header_t *tfn_arr,
  57. msre_rule *rule, apr_pool_t *mptmp);
  58. #endif
  59. /* Structures with the corresponding functions */
  60. struct msre_engine {
  61. apr_pool_t *mp;
  62. apr_table_t *variables;
  63. apr_table_t *operators;
  64. apr_table_t *actions;
  65. apr_table_t *tfns;
  66. apr_table_t *reqbody_processors;
  67. };
  68. msre_engine DSOLOCAL *msre_engine_create(apr_pool_t *parent_pool);
  69. void DSOLOCAL msre_engine_destroy(msre_engine *engine);
  70. msre_op_metadata DSOLOCAL *msre_engine_op_resolve(msre_engine *engine, const char *name);
  71. struct msre_ruleset {
  72. apr_pool_t *mp;
  73. msre_engine *engine;
  74. apr_array_header_t *phase_request_headers;
  75. apr_array_header_t *phase_request_body;
  76. apr_array_header_t *phase_response_headers;
  77. apr_array_header_t *phase_response_body;
  78. apr_array_header_t *phase_logging;
  79. };
  80. apr_status_t DSOLOCAL msre_ruleset_process_phase(msre_ruleset *ruleset, modsec_rec *msr);
  81. apr_status_t DSOLOCAL msre_ruleset_process_phase_internal(msre_ruleset *ruleset, modsec_rec *msr);
  82. msre_ruleset DSOLOCAL *msre_ruleset_create(msre_engine *engine, apr_pool_t *mp);
  83. int DSOLOCAL msre_ruleset_rule_add(msre_ruleset *ruleset, msre_rule *rule, int phase);
  84. msre_rule DSOLOCAL *msre_ruleset_fetch_rule(msre_ruleset *ruleset, const char *id, int offset);
  85. int DSOLOCAL msre_ruleset_rule_remove_with_exception(msre_ruleset *ruleset, rule_exception *re);
  86. /*
  87. int DSOLOCAL msre_ruleset_phase_rule_remove_with_exception(msre_ruleset *ruleset, rule_exception *re,
  88. apr_array_header_t *phase_arr);
  89. */
  90. #define RULE_NO_MATCH 0
  91. #define RULE_MATCH 1
  92. #define RULE_PH_NONE 0 /* Not a placeholder */
  93. #define RULE_PH_SKIPAFTER 1 /* Implicit placeholder for skipAfter */
  94. #define RULE_PH_MARKER 2 /* Explicit placeholder for SecMarker */
  95. #define RULE_TYPE_NORMAL 0 /* SecRule */
  96. #define RULE_TYPE_ACTION 1 /* SecAction */
  97. #define RULE_TYPE_MARKER 2 /* SecMarker */
  98. #if defined(WITH_LUA)
  99. #define RULE_TYPE_LUA 3 /* SecRuleScript */
  100. #endif
  101. struct msre_ipmatch {
  102. apr_ipsubnet_t *ipsubnet;
  103. const char * address;
  104. struct msre_ipmatch *next;
  105. };
  106. struct msre_rule {
  107. apr_array_header_t *targets;
  108. const char *op_name;
  109. const char *op_param;
  110. void *op_param_data;
  111. msre_op_metadata *op_metadata;
  112. unsigned int op_negated;
  113. msre_actionset *actionset;
  114. const char *p1;
  115. const char *unparsed;
  116. const char *filename;
  117. int line_num;
  118. int placeholder;
  119. int type;
  120. msre_ruleset *ruleset;
  121. msre_rule *chain_starter;
  122. #if defined(PERFORMANCE_MEASUREMENT)
  123. unsigned int execution_time;
  124. unsigned int trans_time;
  125. unsigned int op_time;
  126. #endif
  127. #if defined(WITH_LUA)
  128. /* Compiled Lua script. */
  129. msc_script *script;
  130. #endif
  131. ap_regex_t *sub_regex;
  132. char *sub_str;
  133. char *re_str;
  134. int re_precomp;
  135. int escape_re;
  136. msre_ipmatch *ip_op;
  137. };
  138. char DSOLOCAL *msre_rule_generate_unparsed(apr_pool_t *pool, const msre_rule *rule, const char *targets, const char *args, const char *actions);
  139. msre_rule DSOLOCAL *msre_rule_create(msre_ruleset *ruleset, int type,
  140. const char *fn, int line, const char *targets,
  141. const char *args, const char *actions, char **error_msg);
  142. #if defined(WITH_LUA)
  143. msre_rule DSOLOCAL *msre_rule_lua_create(msre_ruleset *ruleset,
  144. const char *fn, int line, const char *script_filename,
  145. const char *actions, char **error_msg);
  146. #endif
  147. #define VAR_SIMPLE 0 /* REQUEST_URI */
  148. #define VAR_LIST 1
  149. #define PHASE_REQUEST_HEADERS 1
  150. #define PHASE_REQUEST_BODY 2
  151. #define PHASE_RESPONSE_HEADERS 3
  152. #define PHASE_RESPONSE_BODY 4
  153. #define PHASE_LOGGING 5
  154. typedef int (*fn_op_param_init_t)(msre_rule *rule, char **error_msg);
  155. typedef int (*fn_op_execute_t)(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg);
  156. struct msre_op_metadata {
  157. const char *name;
  158. fn_op_param_init_t param_init;
  159. fn_op_execute_t execute;
  160. };
  161. typedef int (*fn_tfn_execute_t)(apr_pool_t *pool, unsigned char *input, long int input_length, char **rval, long int *rval_length);
  162. struct msre_tfn_metadata {
  163. const char *name;
  164. /* Functions should populate *rval and return 1 on
  165. * success, or return -1 on failure (in which case *rval
  166. * should contain the error message. Strict functions
  167. * (those that validate in
  168. * addition to transforming) can return 0 when input
  169. * fails validation. Functions are free to perform
  170. * in-place transformation, or to allocate a new buffer
  171. * from the provideded temporary (per-rule) memory pool.
  172. *
  173. * NOTE Strict transformation functions not supported yet.
  174. */
  175. fn_tfn_execute_t execute;
  176. };
  177. void DSOLOCAL msre_engine_tfn_register(msre_engine *engine, const char *name,
  178. fn_tfn_execute_t execute);
  179. void DSOLOCAL msre_engine_op_register(msre_engine *engine, const char *name,
  180. fn_op_param_init_t fn1, fn_op_execute_t fn2);
  181. void DSOLOCAL msre_engine_register_default_tfns(msre_engine *engine);
  182. void DSOLOCAL msre_engine_register_default_variables(msre_engine *engine);
  183. void DSOLOCAL msre_engine_register_default_operators(msre_engine *engine);
  184. void DSOLOCAL msre_engine_register_default_actions(msre_engine *engine);
  185. msre_tfn_metadata DSOLOCAL *msre_engine_tfn_resolve(msre_engine *engine, const char *name);
  186. #define VAR_DONT_CACHE 0
  187. #define VAR_CACHE 1
  188. typedef char *(*fn_var_validate_t)(msre_ruleset *ruleset, msre_var *var);
  189. typedef int (*fn_var_generate_t)(modsec_rec *msr, msre_var *var, msre_rule *rule, apr_table_t *table, apr_pool_t *mptmp);
  190. struct msre_var_metadata {
  191. const char *name;
  192. unsigned int type; /* VAR_TYPE_ constants */
  193. unsigned int argc_min;
  194. unsigned int argc_max;
  195. fn_var_validate_t validate;
  196. fn_var_generate_t generate;
  197. unsigned int is_cacheable; /* 0 - no, 1 - yes */
  198. unsigned int availability; /* when does this variable become available? */
  199. };
  200. struct msre_var {
  201. char *name;
  202. const char *value;
  203. unsigned int value_len;
  204. char *param;
  205. const void *param_data;
  206. msre_var_metadata *metadata;
  207. msc_regex_t *param_regex;
  208. unsigned int is_negated;
  209. unsigned int is_counting;
  210. };
  211. struct msre_actionset {
  212. apr_table_t *actions;
  213. /* Metadata */
  214. const char *id;
  215. const char *rev;
  216. const char *msg;
  217. const char *logdata;
  218. int severity;
  219. int phase;
  220. msre_rule *rule;
  221. int arg_min;
  222. int arg_max;
  223. /* Flow */
  224. int is_chained;
  225. int skip_count;
  226. const char *skip_after;
  227. /* Disruptive */
  228. int intercept_action;
  229. const char *intercept_uri;
  230. int intercept_status;
  231. int intercept_pause;
  232. /* "block" needs parent action to reset it */
  233. msre_action *parent_intercept_action_rec;
  234. msre_action *intercept_action_rec;
  235. int parent_intercept_action;
  236. /* Other */
  237. int log;
  238. int auditlog;
  239. int block;
  240. };
  241. void DSOLOCAL msre_engine_variable_register(msre_engine *engine, const char *name,
  242. unsigned int type, unsigned int argc_min, unsigned int argc_max,
  243. fn_var_validate_t validate, fn_var_generate_t generate,
  244. unsigned int is_cacheable, unsigned int availability);
  245. msre_actionset DSOLOCAL *msre_actionset_create(msre_engine *engine, const char *text,
  246. char **error_msg);
  247. msre_actionset DSOLOCAL *msre_actionset_merge(msre_engine *engine, msre_actionset *parent,
  248. msre_actionset *child, int inherit_by_default);
  249. msre_actionset DSOLOCAL *msre_actionset_create_default(msre_engine *engine);
  250. void DSOLOCAL msre_actionset_set_defaults(msre_actionset *actionset);
  251. void DSOLOCAL msre_actionset_init(msre_actionset *actionset, msre_rule *rule);
  252. typedef char *(*fn_action_validate_t)(msre_engine *engine, msre_action *action);
  253. typedef apr_status_t (*fn_action_init_t)(msre_engine *engine, msre_actionset *actionset, msre_action *action);
  254. typedef apr_status_t (*fn_action_execute_t)(modsec_rec *msr, apr_pool_t *mptmp, msre_rule *rule, msre_action *action);
  255. #define ACTION_DISRUPTIVE 1
  256. #define ACTION_NON_DISRUPTIVE 2
  257. #define ACTION_METADATA 3
  258. #define ACTION_FLOW 4
  259. #define NO_PLUS_MINUS 0
  260. #define ALLOW_PLUS_MINUS 1
  261. #define ACTION_CARDINALITY_ONE 1
  262. #define ACTION_CARDINALITY_MANY 2
  263. #define ACTION_CGROUP_NONE 0
  264. #define ACTION_CGROUP_DISRUPTIVE 1
  265. #define ACTION_CGROUP_LOG 2
  266. #define ACTION_CGROUP_AUDITLOG 3
  267. struct msre_action_metadata {
  268. const char *name;
  269. unsigned int type;
  270. unsigned int argc_min;
  271. unsigned int argc_max;
  272. unsigned int allow_param_plusminus;
  273. unsigned int cardinality;
  274. unsigned int cardinality_group;
  275. fn_action_validate_t validate;
  276. fn_action_init_t init;
  277. fn_action_execute_t execute;
  278. };
  279. struct msre_action {
  280. msre_action_metadata *metadata;
  281. const char *param;
  282. const void *param_data;
  283. unsigned int param_plusminus; /* ABSOLUTE_VALUE, POSITIVE_VALUE, NEGATIVE_VALUE */
  284. };
  285. void DSOLOCAL msre_engine_reqbody_processor_register(msre_engine *engine,
  286. const char *name, void *fn_init, void *fn_process, void *fn_complete);
  287. typedef int (*fn_reqbody_processor_init_t)(modsec_rec *msr, char **error_msg);
  288. typedef int (*fn_reqbody_processor_process_t)(modsec_rec *msr, const char *buf,
  289. unsigned int size, char **error_msg);
  290. typedef int (*fn_reqbody_processor_complete_t)(modsec_rec *msr, char **error_msg);
  291. struct msre_reqbody_processor_metadata {
  292. const char *name;
  293. fn_reqbody_processor_init_t init;
  294. fn_reqbody_processor_process_t process;
  295. fn_reqbody_processor_complete_t complete;
  296. };
  297. /* -- MSRE Function Prototypes ---------------------------------------------- */
  298. msre_var_metadata DSOLOCAL *msre_resolve_var(msre_engine *engine, const char *name);
  299. int DSOLOCAL msre_parse_generic(apr_pool_t *pool, const char *text, apr_table_t *vartable,
  300. char **error_msg);
  301. apr_status_t DSOLOCAL msre_parse_vars(msre_ruleset *ruleset, const char *text,
  302. apr_array_header_t *arr, char **error_msg);
  303. char DSOLOCAL *msre_format_metadata(modsec_rec *msr, msre_actionset *actionset);
  304. /* -- Data Cache -- */
  305. struct msre_cache_rec {
  306. int hits;
  307. int changed;
  308. int num;
  309. const char *path;
  310. const char *val;
  311. apr_size_t val_len;
  312. };
  313. #endif