security_events.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. /*
  2. * Asterisk -- An open source telephony toolkit.
  3. *
  4. * Copyright (C) 2012, Digium, Inc.
  5. *
  6. * Russell Bryant <russell@digium.com>
  7. *
  8. * See http://www.asterisk.org for more information about
  9. * the Asterisk project. Please do not directly contact
  10. * any of the maintainers of this project for assistance;
  11. * the project provides a web site, mailing lists and IRC
  12. * channels for your use.
  13. *
  14. * This program is free software, distributed under the terms of
  15. * the GNU General Public License Version 2. See the LICENSE file
  16. * at the top of the source tree.
  17. */
  18. /*!
  19. * \file
  20. *
  21. * \brief Security Event Reporting Helpers
  22. *
  23. * \author Russell Bryant <russell@digium.com>
  24. */
  25. /*** MODULEINFO
  26. <support_level>core</support_level>
  27. ***/
  28. #include "asterisk.h"
  29. ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
  30. #include "asterisk/utils.h"
  31. #include "asterisk/strings.h"
  32. #include "asterisk/network.h"
  33. #include "asterisk/security_events.h"
  34. #include "asterisk/netsock2.h"
  35. static const size_t TIMESTAMP_STR_LEN = 32;
  36. static const struct {
  37. const char *name;
  38. uint32_t version;
  39. enum ast_security_event_severity severity;
  40. #define MAX_SECURITY_IES 12
  41. struct ast_security_event_ie_type required_ies[MAX_SECURITY_IES];
  42. struct ast_security_event_ie_type optional_ies[MAX_SECURITY_IES];
  43. #undef MAX_SECURITY_IES
  44. } sec_events[AST_SECURITY_EVENT_NUM_TYPES] = {
  45. #define SEC_EVT_FIELD(e, field) (offsetof(struct ast_security_event_##e, field))
  46. [AST_SECURITY_EVENT_FAILED_ACL] = {
  47. .name = "FailedACL",
  48. .version = AST_SECURITY_EVENT_FAILED_ACL_VERSION,
  49. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  50. .required_ies = {
  51. { AST_EVENT_IE_EVENT_TV, 0 },
  52. { AST_EVENT_IE_SEVERITY, 0 },
  53. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  54. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  55. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  56. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  57. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  58. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  59. { AST_EVENT_IE_END, 0 }
  60. },
  61. .optional_ies = {
  62. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  63. { AST_EVENT_IE_ACL_NAME, SEC_EVT_FIELD(failed_acl, acl_name) },
  64. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  65. { AST_EVENT_IE_END, 0 }
  66. },
  67. },
  68. [AST_SECURITY_EVENT_INVAL_ACCT_ID] = {
  69. .name = "InvalidAccountID",
  70. .version = AST_SECURITY_EVENT_INVAL_ACCT_ID_VERSION,
  71. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  72. .required_ies = {
  73. { AST_EVENT_IE_EVENT_TV, 0 },
  74. { AST_EVENT_IE_SEVERITY, 0 },
  75. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  76. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  77. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  78. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  79. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  80. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  81. { AST_EVENT_IE_END, 0 }
  82. },
  83. .optional_ies = {
  84. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  85. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  86. { AST_EVENT_IE_END, 0 }
  87. },
  88. },
  89. [AST_SECURITY_EVENT_SESSION_LIMIT] = {
  90. .name = "SessionLimit",
  91. .version = AST_SECURITY_EVENT_SESSION_LIMIT_VERSION,
  92. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  93. .required_ies = {
  94. { AST_EVENT_IE_EVENT_TV, 0 },
  95. { AST_EVENT_IE_SEVERITY, 0 },
  96. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  97. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  98. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  99. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  100. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  101. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  102. { AST_EVENT_IE_END, 0 }
  103. },
  104. .optional_ies = {
  105. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  106. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  107. { AST_EVENT_IE_END, 0 }
  108. },
  109. },
  110. [AST_SECURITY_EVENT_MEM_LIMIT] = {
  111. .name = "MemoryLimit",
  112. .version = AST_SECURITY_EVENT_MEM_LIMIT_VERSION,
  113. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  114. .required_ies = {
  115. { AST_EVENT_IE_EVENT_TV, 0 },
  116. { AST_EVENT_IE_SEVERITY, 0 },
  117. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  118. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  119. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  120. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  121. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  122. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  123. { AST_EVENT_IE_END, 0 }
  124. },
  125. .optional_ies = {
  126. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  127. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  128. { AST_EVENT_IE_END, 0 }
  129. },
  130. },
  131. [AST_SECURITY_EVENT_LOAD_AVG] = {
  132. .name = "LoadAverageLimit",
  133. .version = AST_SECURITY_EVENT_LOAD_AVG_VERSION,
  134. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  135. .required_ies = {
  136. { AST_EVENT_IE_EVENT_TV, 0 },
  137. { AST_EVENT_IE_SEVERITY, 0 },
  138. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  139. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  140. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  141. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  142. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  143. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  144. { AST_EVENT_IE_END, 0 }
  145. },
  146. .optional_ies = {
  147. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  148. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  149. { AST_EVENT_IE_END, 0 }
  150. },
  151. },
  152. [AST_SECURITY_EVENT_REQ_NO_SUPPORT] = {
  153. .name = "RequestNotSupported",
  154. .version = AST_SECURITY_EVENT_REQ_NO_SUPPORT_VERSION,
  155. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  156. .required_ies = {
  157. { AST_EVENT_IE_EVENT_TV, 0 },
  158. { AST_EVENT_IE_SEVERITY, 0 },
  159. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  160. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  161. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  162. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  163. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  164. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  165. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_no_support, request_type) },
  166. { AST_EVENT_IE_END, 0 }
  167. },
  168. .optional_ies = {
  169. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  170. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  171. { AST_EVENT_IE_END, 0 }
  172. },
  173. },
  174. [AST_SECURITY_EVENT_REQ_NOT_ALLOWED] = {
  175. .name = "RequestNotAllowed",
  176. .version = AST_SECURITY_EVENT_REQ_NOT_ALLOWED_VERSION,
  177. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  178. .required_ies = {
  179. { AST_EVENT_IE_EVENT_TV, 0 },
  180. { AST_EVENT_IE_SEVERITY, 0 },
  181. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  182. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  183. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  184. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  185. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  186. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  187. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_not_allowed, request_type) },
  188. { AST_EVENT_IE_END, 0 }
  189. },
  190. .optional_ies = {
  191. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  192. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  193. { AST_EVENT_IE_REQUEST_PARAMS, SEC_EVT_FIELD(req_not_allowed, request_params) },
  194. { AST_EVENT_IE_END, 0 }
  195. },
  196. },
  197. [AST_SECURITY_EVENT_AUTH_METHOD_NOT_ALLOWED] = {
  198. .name = "AuthMethodNotAllowed",
  199. .version = AST_SECURITY_EVENT_AUTH_METHOD_NOT_ALLOWED_VERSION,
  200. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  201. .required_ies = {
  202. { AST_EVENT_IE_EVENT_TV, 0 },
  203. { AST_EVENT_IE_SEVERITY, 0 },
  204. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  205. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  206. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  207. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  208. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  209. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  210. { AST_EVENT_IE_AUTH_METHOD, SEC_EVT_FIELD(auth_method_not_allowed, auth_method) },
  211. { AST_EVENT_IE_END, 0 }
  212. },
  213. .optional_ies = {
  214. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  215. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  216. { AST_EVENT_IE_END, 0 }
  217. },
  218. },
  219. [AST_SECURITY_EVENT_REQ_BAD_FORMAT] = {
  220. .name = "RequestBadFormat",
  221. .version = AST_SECURITY_EVENT_REQ_BAD_FORMAT_VERSION,
  222. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  223. .required_ies = {
  224. { AST_EVENT_IE_EVENT_TV, 0 },
  225. { AST_EVENT_IE_SEVERITY, 0 },
  226. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  227. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  228. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  229. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  230. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  231. { AST_EVENT_IE_REQUEST_TYPE, SEC_EVT_FIELD(req_bad_format, request_type) },
  232. { AST_EVENT_IE_END, 0 }
  233. },
  234. .optional_ies = {
  235. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  236. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  237. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  238. { AST_EVENT_IE_REQUEST_PARAMS, SEC_EVT_FIELD(req_bad_format, request_params) },
  239. { AST_EVENT_IE_END, 0 }
  240. },
  241. },
  242. [AST_SECURITY_EVENT_SUCCESSFUL_AUTH] = {
  243. .name = "SuccessfulAuth",
  244. .version = AST_SECURITY_EVENT_SUCCESSFUL_AUTH_VERSION,
  245. .severity = AST_SECURITY_EVENT_SEVERITY_INFO,
  246. .required_ies = {
  247. { AST_EVENT_IE_EVENT_TV, 0 },
  248. { AST_EVENT_IE_SEVERITY, 0 },
  249. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  250. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  251. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  252. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  253. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  254. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  255. { AST_EVENT_IE_USING_PASSWORD, SEC_EVT_FIELD(successful_auth, using_password) },
  256. { AST_EVENT_IE_END, 0 }
  257. },
  258. .optional_ies = {
  259. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  260. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  261. { AST_EVENT_IE_END, 0 }
  262. },
  263. },
  264. [AST_SECURITY_EVENT_UNEXPECTED_ADDR] = {
  265. .name = "UnexpectedAddress",
  266. .version = AST_SECURITY_EVENT_UNEXPECTED_ADDR_VERSION,
  267. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  268. .required_ies = {
  269. { AST_EVENT_IE_EVENT_TV, 0 },
  270. { AST_EVENT_IE_SEVERITY, 0 },
  271. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  272. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  273. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  274. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  275. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  276. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  277. { AST_EVENT_IE_EXPECTED_ADDR, SEC_EVT_FIELD(unexpected_addr, expected_addr) },
  278. { AST_EVENT_IE_END, 0 }
  279. },
  280. .optional_ies = {
  281. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  282. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  283. { AST_EVENT_IE_END, 0 }
  284. },
  285. },
  286. [AST_SECURITY_EVENT_CHAL_RESP_FAILED] = {
  287. .name = "ChallengeResponseFailed",
  288. .version = AST_SECURITY_EVENT_CHAL_RESP_FAILED_VERSION,
  289. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  290. .required_ies = {
  291. { AST_EVENT_IE_EVENT_TV, 0 },
  292. { AST_EVENT_IE_SEVERITY, 0 },
  293. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  294. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  295. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  296. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  297. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  298. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  299. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(chal_resp_failed, challenge) },
  300. { AST_EVENT_IE_RESPONSE, SEC_EVT_FIELD(chal_resp_failed, response) },
  301. { AST_EVENT_IE_EXPECTED_RESPONSE, SEC_EVT_FIELD(chal_resp_failed, expected_response) },
  302. { AST_EVENT_IE_END, 0 }
  303. },
  304. .optional_ies = {
  305. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  306. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  307. { AST_EVENT_IE_END, 0 }
  308. },
  309. },
  310. [AST_SECURITY_EVENT_INVAL_PASSWORD] = {
  311. .name = "InvalidPassword",
  312. .version = AST_SECURITY_EVENT_INVAL_PASSWORD_VERSION,
  313. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  314. .required_ies = {
  315. { AST_EVENT_IE_EVENT_TV, 0 },
  316. { AST_EVENT_IE_SEVERITY, 0 },
  317. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  318. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  319. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  320. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  321. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  322. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  323. { AST_EVENT_IE_END, 0 }
  324. },
  325. .optional_ies = {
  326. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  327. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  328. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(inval_password, challenge) },
  329. { AST_EVENT_IE_RECEIVED_CHALLENGE, SEC_EVT_FIELD(inval_password, received_challenge) },
  330. { AST_EVENT_IE_RECEIVED_HASH, SEC_EVT_FIELD(inval_password, received_hash) },
  331. { AST_EVENT_IE_END, 0 }
  332. },
  333. },
  334. [AST_SECURITY_EVENT_CHAL_SENT] = {
  335. .name = "ChallengeSent",
  336. .version = AST_SECURITY_EVENT_CHAL_SENT_VERSION,
  337. .severity = AST_SECURITY_EVENT_SEVERITY_INFO,
  338. .required_ies = {
  339. { AST_EVENT_IE_EVENT_TV, 0 },
  340. { AST_EVENT_IE_SEVERITY, 0 },
  341. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  342. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  343. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  344. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  345. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  346. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  347. { AST_EVENT_IE_CHALLENGE, SEC_EVT_FIELD(chal_sent, challenge) },
  348. { AST_EVENT_IE_END, 0 }
  349. },
  350. .optional_ies = {
  351. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  352. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  353. { AST_EVENT_IE_END, 0 }
  354. },
  355. },
  356. [AST_SECURITY_EVENT_INVAL_TRANSPORT] = {
  357. .name = "InvalidTransport",
  358. .version = AST_SECURITY_EVENT_INVAL_TRANSPORT_VERSION,
  359. .severity = AST_SECURITY_EVENT_SEVERITY_ERROR,
  360. .required_ies = {
  361. { AST_EVENT_IE_EVENT_TV, 0 },
  362. { AST_EVENT_IE_SEVERITY, 0 },
  363. { AST_EVENT_IE_SERVICE, SEC_EVT_FIELD(common, service) },
  364. { AST_EVENT_IE_EVENT_VERSION, SEC_EVT_FIELD(common, version) },
  365. { AST_EVENT_IE_ACCOUNT_ID, SEC_EVT_FIELD(common, account_id) },
  366. { AST_EVENT_IE_SESSION_ID, SEC_EVT_FIELD(common, session_id) },
  367. { AST_EVENT_IE_LOCAL_ADDR, SEC_EVT_FIELD(common, local_addr) },
  368. { AST_EVENT_IE_REMOTE_ADDR, SEC_EVT_FIELD(common, remote_addr) },
  369. { AST_EVENT_IE_ATTEMPTED_TRANSPORT, SEC_EVT_FIELD(inval_transport, transport) },
  370. { AST_EVENT_IE_END, 0 }
  371. },
  372. .optional_ies = {
  373. { AST_EVENT_IE_MODULE, SEC_EVT_FIELD(common, module) },
  374. { AST_EVENT_IE_SESSION_TV, SEC_EVT_FIELD(common, session_tv) },
  375. { AST_EVENT_IE_END, 0 }
  376. },
  377. },
  378. #undef SEC_EVT_FIELD
  379. };
  380. static const struct {
  381. enum ast_security_event_severity severity;
  382. const char *str;
  383. } severities[] = {
  384. { AST_SECURITY_EVENT_SEVERITY_INFO, "Informational" },
  385. { AST_SECURITY_EVENT_SEVERITY_ERROR, "Error" },
  386. };
  387. const char *ast_security_event_severity_get_name(
  388. const enum ast_security_event_severity severity)
  389. {
  390. unsigned int i;
  391. for (i = 0; i < ARRAY_LEN(severities); i++) {
  392. if (severities[i].severity == severity) {
  393. return severities[i].str;
  394. }
  395. }
  396. return NULL;
  397. }
  398. static int check_event_type(const enum ast_security_event_type event_type)
  399. {
  400. if (event_type >= AST_SECURITY_EVENT_NUM_TYPES) {
  401. ast_log(LOG_ERROR, "Invalid security event type %u\n", event_type);
  402. return -1;
  403. }
  404. return 0;
  405. }
  406. const char *ast_security_event_get_name(const enum ast_security_event_type event_type)
  407. {
  408. if (check_event_type(event_type)) {
  409. return NULL;
  410. }
  411. return sec_events[event_type].name;
  412. }
  413. const struct ast_security_event_ie_type *ast_security_event_get_required_ies(
  414. const enum ast_security_event_type event_type)
  415. {
  416. if (check_event_type(event_type)) {
  417. return NULL;
  418. }
  419. return sec_events[event_type].required_ies;
  420. }
  421. const struct ast_security_event_ie_type *ast_security_event_get_optional_ies(
  422. const enum ast_security_event_type event_type)
  423. {
  424. if (check_event_type(event_type)) {
  425. return NULL;
  426. }
  427. return sec_events[event_type].optional_ies;
  428. }
  429. static void encode_timestamp(struct ast_str **str, const struct timeval *tv)
  430. {
  431. ast_str_set(str, 0, "%u-%u",
  432. (unsigned int) tv->tv_sec,
  433. (unsigned int) tv->tv_usec);
  434. }
  435. static struct ast_event *alloc_event(const struct ast_security_event_common *sec)
  436. {
  437. struct ast_str *str = ast_str_alloca(TIMESTAMP_STR_LEN);
  438. struct timeval tv = ast_tvnow();
  439. const char *severity_str;
  440. if (check_event_type(sec->event_type)) {
  441. return NULL;
  442. }
  443. encode_timestamp(&str, &tv);
  444. severity_str = S_OR(
  445. ast_security_event_severity_get_name(sec_events[sec->event_type].severity),
  446. "Unknown"
  447. );
  448. return ast_event_new(AST_EVENT_SECURITY,
  449. AST_EVENT_IE_SECURITY_EVENT, AST_EVENT_IE_PLTYPE_UINT, sec->event_type,
  450. AST_EVENT_IE_EVENT_VERSION, AST_EVENT_IE_PLTYPE_UINT, sec->version,
  451. AST_EVENT_IE_EVENT_TV, AST_EVENT_IE_PLTYPE_STR, ast_str_buffer(str),
  452. AST_EVENT_IE_SERVICE, AST_EVENT_IE_PLTYPE_STR, sec->service,
  453. AST_EVENT_IE_SEVERITY, AST_EVENT_IE_PLTYPE_STR, severity_str,
  454. AST_EVENT_IE_END);
  455. }
  456. static int add_timeval_ie(struct ast_event **event, enum ast_event_ie_type ie_type,
  457. const struct timeval *tv)
  458. {
  459. struct ast_str *str = ast_str_alloca(TIMESTAMP_STR_LEN);
  460. encode_timestamp(&str, tv);
  461. return ast_event_append_ie_str(event, ie_type, ast_str_buffer(str));
  462. }
  463. static int add_ip_ie(struct ast_event **event, enum ast_event_ie_type ie_type,
  464. const struct ast_security_event_ip_addr *addr)
  465. {
  466. struct ast_str *str = ast_str_alloca(64);
  467. ast_str_set(&str, 0, (ast_sockaddr_is_ipv4(addr->addr) || ast_sockaddr_is_ipv4_mapped(addr->addr)) ? "IPV4/" : "IPV6/");
  468. switch (addr->transport) {
  469. case AST_SECURITY_EVENT_TRANSPORT_UDP:
  470. ast_str_append(&str, 0, "UDP/");
  471. break;
  472. case AST_SECURITY_EVENT_TRANSPORT_TCP:
  473. ast_str_append(&str, 0, "TCP/");
  474. break;
  475. case AST_SECURITY_EVENT_TRANSPORT_TLS:
  476. ast_str_append(&str, 0, "TLS/");
  477. break;
  478. }
  479. ast_str_append(&str, 0, "%s", ast_sockaddr_stringify_addr(addr->addr));
  480. ast_str_append(&str, 0, "/%s", ast_sockaddr_stringify_port(addr->addr));
  481. return ast_event_append_ie_str(event, ie_type, ast_str_buffer(str));
  482. }
  483. enum ie_required {
  484. NOT_REQUIRED,
  485. REQUIRED
  486. };
  487. static int add_ie(struct ast_event **event, const struct ast_security_event_common *sec,
  488. const struct ast_security_event_ie_type *ie_type, enum ie_required req)
  489. {
  490. int res = 0;
  491. switch (ie_type->ie_type) {
  492. case AST_EVENT_IE_SERVICE:
  493. case AST_EVENT_IE_ACCOUNT_ID:
  494. case AST_EVENT_IE_SESSION_ID:
  495. case AST_EVENT_IE_MODULE:
  496. case AST_EVENT_IE_ACL_NAME:
  497. case AST_EVENT_IE_REQUEST_TYPE:
  498. case AST_EVENT_IE_REQUEST_PARAMS:
  499. case AST_EVENT_IE_AUTH_METHOD:
  500. case AST_EVENT_IE_CHALLENGE:
  501. case AST_EVENT_IE_RESPONSE:
  502. case AST_EVENT_IE_EXPECTED_RESPONSE:
  503. case AST_EVENT_IE_RECEIVED_CHALLENGE:
  504. case AST_EVENT_IE_RECEIVED_HASH:
  505. case AST_EVENT_IE_ATTEMPTED_TRANSPORT:
  506. {
  507. const char *str;
  508. str = *((const char **)(((const char *) sec) + ie_type->offset));
  509. if (req && !str) {
  510. ast_log(LOG_WARNING, "Required IE '%d' for security event "
  511. "type '%u' not present\n", ie_type->ie_type,
  512. sec->event_type);
  513. res = -1;
  514. }
  515. if (str) {
  516. res = ast_event_append_ie_str(event, ie_type->ie_type, str);
  517. }
  518. break;
  519. }
  520. case AST_EVENT_IE_EVENT_VERSION:
  521. case AST_EVENT_IE_USING_PASSWORD:
  522. {
  523. uint32_t val;
  524. val = *((const uint32_t *)(((const char *) sec) + ie_type->offset));
  525. res = ast_event_append_ie_uint(event, ie_type->ie_type, val);
  526. break;
  527. }
  528. case AST_EVENT_IE_LOCAL_ADDR:
  529. case AST_EVENT_IE_REMOTE_ADDR:
  530. case AST_EVENT_IE_EXPECTED_ADDR:
  531. {
  532. const struct ast_security_event_ip_addr *addr;
  533. addr = (const struct ast_security_event_ip_addr *)(((const char *) sec) + ie_type->offset);
  534. if (req && !addr->addr) {
  535. ast_log(LOG_WARNING, "Required IE '%d' for security event "
  536. "type '%u' not present\n", ie_type->ie_type,
  537. sec->event_type);
  538. res = -1;
  539. }
  540. if (addr->addr) {
  541. res = add_ip_ie(event, ie_type->ie_type, addr);
  542. }
  543. break;
  544. }
  545. case AST_EVENT_IE_SESSION_TV:
  546. {
  547. const struct timeval *tval;
  548. tval = *((const struct timeval **)(((const char *) sec) + ie_type->offset));
  549. if (req && !tval) {
  550. ast_log(LOG_WARNING, "Required IE '%d' for security event "
  551. "type '%u' not present\n", ie_type->ie_type,
  552. sec->event_type);
  553. res = -1;
  554. }
  555. if (tval) {
  556. add_timeval_ie(event, ie_type->ie_type, tval);
  557. }
  558. break;
  559. }
  560. case AST_EVENT_IE_EVENT_TV:
  561. case AST_EVENT_IE_SEVERITY:
  562. /* Added automatically, nothing to do here. */
  563. break;
  564. default:
  565. ast_log(LOG_WARNING, "Unhandled IE type '%d', this security event "
  566. "will be missing data.\n", ie_type->ie_type);
  567. break;
  568. }
  569. return res;
  570. }
  571. static int handle_security_event(const struct ast_security_event_common *sec)
  572. {
  573. struct ast_event *event;
  574. const struct ast_security_event_ie_type *ies;
  575. unsigned int i;
  576. if (!(event = alloc_event(sec))) {
  577. return -1;
  578. }
  579. for (ies = ast_security_event_get_required_ies(sec->event_type), i = 0;
  580. ies[i].ie_type != AST_EVENT_IE_END;
  581. i++) {
  582. if (add_ie(&event, sec, ies + i, REQUIRED)) {
  583. goto return_error;
  584. }
  585. }
  586. for (ies = ast_security_event_get_optional_ies(sec->event_type), i = 0;
  587. ies[i].ie_type != AST_EVENT_IE_END;
  588. i++) {
  589. if (add_ie(&event, sec, ies + i, NOT_REQUIRED)) {
  590. goto return_error;
  591. }
  592. }
  593. if (ast_event_queue(event)) {
  594. goto return_error;
  595. }
  596. return 0;
  597. return_error:
  598. if (event) {
  599. ast_event_destroy(event);
  600. }
  601. return -1;
  602. }
  603. int ast_security_event_report(const struct ast_security_event_common *sec)
  604. {
  605. int res;
  606. if (sec->event_type >= AST_SECURITY_EVENT_NUM_TYPES) {
  607. ast_log(LOG_ERROR, "Invalid security event type\n");
  608. return -1;
  609. }
  610. if (!sec_events[sec->event_type].name) {
  611. ast_log(LOG_WARNING, "Security event type %u not handled\n",
  612. sec->event_type);
  613. return -1;
  614. }
  615. if (sec->version != sec_events[sec->event_type].version) {
  616. ast_log(LOG_WARNING, "Security event %u version mismatch\n",
  617. sec->event_type);
  618. return -1;
  619. }
  620. res = handle_security_event(sec);
  621. return res;
  622. }