dawnscanner 1.2.99

Sign up to get free protection for your applications and to get access to all the features.
Files changed (306) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +4 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +19 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +8 -0
  8. data/Changelog.md +412 -0
  9. data/Gemfile +4 -0
  10. data/KnowledgeBase.md +213 -0
  11. data/LICENSE.txt +22 -0
  12. data/README.md +354 -0
  13. data/Rakefile +250 -0
  14. data/Roadmap.md +59 -0
  15. data/bin/dawn +210 -0
  16. data/certs/paolo_at_codesake_dot_com.pem +21 -0
  17. data/checksum/.placeholder +0 -0
  18. data/checksum/codesake-dawn-1.1.0.gem.sha512 +1 -0
  19. data/checksum/codesake-dawn-1.1.0.rc1.gem.sha512 +1 -0
  20. data/checksum/codesake-dawn-1.1.1.gem.sha512 +1 -0
  21. data/checksum/codesake-dawn-1.1.2.gem.sha512 +1 -0
  22. data/checksum/codesake-dawn-1.1.3.gem.sha512 +1 -0
  23. data/checksum/codesake-dawn-1.2.0.gem.sha512 +1 -0
  24. data/checksum/codesake-dawn-1.2.99.gem.sha512 +1 -0
  25. data/dawnscanner.gemspec +43 -0
  26. data/doc/codesake-dawn.yaml.sample +26 -0
  27. data/doc/dawn_1_0_announcement.md +139 -0
  28. data/doc/dawn_1_1_announcement.md +67 -0
  29. data/doc/dawn_1_2_announcement.md +69 -0
  30. data/features/dawn_complains_about_an_incorrect_command_line.feature.disabled +21 -0
  31. data/features/dawn_scan_a_secure_sinatra_app.feature.disabled +31 -0
  32. data/features/dawn_scan_a_vulnerable_sinatra_app.feature.disabled +36 -0
  33. data/features/step_definition/dawn_steps.rb +19 -0
  34. data/features/support/env.rb +1 -0
  35. data/lib/codesake-dawn.rb +12 -0
  36. data/lib/codesake/dawn/core.rb +175 -0
  37. data/lib/codesake/dawn/engine.rb +380 -0
  38. data/lib/codesake/dawn/gemfile_lock.rb +12 -0
  39. data/lib/codesake/dawn/kb/basic_check.rb +228 -0
  40. data/lib/codesake/dawn/kb/combo_check.rb +64 -0
  41. data/lib/codesake/dawn/kb/cve_2004_0755.rb +32 -0
  42. data/lib/codesake/dawn/kb/cve_2004_0983.rb +30 -0
  43. data/lib/codesake/dawn/kb/cve_2005_1992.rb +30 -0
  44. data/lib/codesake/dawn/kb/cve_2005_2337.rb +32 -0
  45. data/lib/codesake/dawn/kb/cve_2006_1931.rb +32 -0
  46. data/lib/codesake/dawn/kb/cve_2006_2582.rb +30 -0
  47. data/lib/codesake/dawn/kb/cve_2006_3694.rb +31 -0
  48. data/lib/codesake/dawn/kb/cve_2006_4112.rb +29 -0
  49. data/lib/codesake/dawn/kb/cve_2006_5467.rb +30 -0
  50. data/lib/codesake/dawn/kb/cve_2006_6303.rb +30 -0
  51. data/lib/codesake/dawn/kb/cve_2006_6852.rb +29 -0
  52. data/lib/codesake/dawn/kb/cve_2006_6979.rb +31 -0
  53. data/lib/codesake/dawn/kb/cve_2007_0469.rb +29 -0
  54. data/lib/codesake/dawn/kb/cve_2007_5162.rb +30 -0
  55. data/lib/codesake/dawn/kb/cve_2007_5379.rb +29 -0
  56. data/lib/codesake/dawn/kb/cve_2007_5380.rb +29 -0
  57. data/lib/codesake/dawn/kb/cve_2007_5770.rb +32 -0
  58. data/lib/codesake/dawn/kb/cve_2007_6077.rb +31 -0
  59. data/lib/codesake/dawn/kb/cve_2007_6612.rb +30 -0
  60. data/lib/codesake/dawn/kb/cve_2008_1145.rb +40 -0
  61. data/lib/codesake/dawn/kb/cve_2008_1891.rb +40 -0
  62. data/lib/codesake/dawn/kb/cve_2008_2376.rb +32 -0
  63. data/lib/codesake/dawn/kb/cve_2008_2662.rb +35 -0
  64. data/lib/codesake/dawn/kb/cve_2008_2663.rb +34 -0
  65. data/lib/codesake/dawn/kb/cve_2008_2664.rb +35 -0
  66. data/lib/codesake/dawn/kb/cve_2008_2725.rb +33 -0
  67. data/lib/codesake/dawn/kb/cve_2008_3655.rb +39 -0
  68. data/lib/codesake/dawn/kb/cve_2008_3657.rb +39 -0
  69. data/lib/codesake/dawn/kb/cve_2008_3790.rb +32 -0
  70. data/lib/codesake/dawn/kb/cve_2008_3905.rb +38 -0
  71. data/lib/codesake/dawn/kb/cve_2008_4094.rb +29 -0
  72. data/lib/codesake/dawn/kb/cve_2008_4310.rb +103 -0
  73. data/lib/codesake/dawn/kb/cve_2008_5189.rb +29 -0
  74. data/lib/codesake/dawn/kb/cve_2008_7248.rb +29 -0
  75. data/lib/codesake/dawn/kb/cve_2009_4078.rb +31 -0
  76. data/lib/codesake/dawn/kb/cve_2009_4124.rb +32 -0
  77. data/lib/codesake/dawn/kb/cve_2009_4214.rb +29 -0
  78. data/lib/codesake/dawn/kb/cve_2010_1330.rb +30 -0
  79. data/lib/codesake/dawn/kb/cve_2010_2489.rb +62 -0
  80. data/lib/codesake/dawn/kb/cve_2010_3933.rb +29 -0
  81. data/lib/codesake/dawn/kb/cve_2011_0188.rb +69 -0
  82. data/lib/codesake/dawn/kb/cve_2011_0446.rb +30 -0
  83. data/lib/codesake/dawn/kb/cve_2011_0447.rb +30 -0
  84. data/lib/codesake/dawn/kb/cve_2011_0739.rb +30 -0
  85. data/lib/codesake/dawn/kb/cve_2011_0995.rb +63 -0
  86. data/lib/codesake/dawn/kb/cve_2011_1004.rb +36 -0
  87. data/lib/codesake/dawn/kb/cve_2011_1005.rb +33 -0
  88. data/lib/codesake/dawn/kb/cve_2011_2197.rb +29 -0
  89. data/lib/codesake/dawn/kb/cve_2011_2686.rb +31 -0
  90. data/lib/codesake/dawn/kb/cve_2011_2705.rb +34 -0
  91. data/lib/codesake/dawn/kb/cve_2011_2929.rb +29 -0
  92. data/lib/codesake/dawn/kb/cve_2011_2930.rb +30 -0
  93. data/lib/codesake/dawn/kb/cve_2011_2931.rb +32 -0
  94. data/lib/codesake/dawn/kb/cve_2011_2932.rb +29 -0
  95. data/lib/codesake/dawn/kb/cve_2011_3009.rb +30 -0
  96. data/lib/codesake/dawn/kb/cve_2011_3186.rb +31 -0
  97. data/lib/codesake/dawn/kb/cve_2011_3187.rb +31 -0
  98. data/lib/codesake/dawn/kb/cve_2011_4319.rb +31 -0
  99. data/lib/codesake/dawn/kb/cve_2011_4815.rb +30 -0
  100. data/lib/codesake/dawn/kb/cve_2011_5036.rb +28 -0
  101. data/lib/codesake/dawn/kb/cve_2012_1098.rb +32 -0
  102. data/lib/codesake/dawn/kb/cve_2012_1099.rb +29 -0
  103. data/lib/codesake/dawn/kb/cve_2012_1241.rb +29 -0
  104. data/lib/codesake/dawn/kb/cve_2012_2139.rb +28 -0
  105. data/lib/codesake/dawn/kb/cve_2012_2140.rb +29 -0
  106. data/lib/codesake/dawn/kb/cve_2012_2660.rb +30 -0
  107. data/lib/codesake/dawn/kb/cve_2012_2661.rb +29 -0
  108. data/lib/codesake/dawn/kb/cve_2012_2671.rb +30 -0
  109. data/lib/codesake/dawn/kb/cve_2012_2694.rb +32 -0
  110. data/lib/codesake/dawn/kb/cve_2012_2695.rb +29 -0
  111. data/lib/codesake/dawn/kb/cve_2012_3424.rb +31 -0
  112. data/lib/codesake/dawn/kb/cve_2012_3463.rb +29 -0
  113. data/lib/codesake/dawn/kb/cve_2012_3464.rb +29 -0
  114. data/lib/codesake/dawn/kb/cve_2012_3465.rb +28 -0
  115. data/lib/codesake/dawn/kb/cve_2012_4464.rb +29 -0
  116. data/lib/codesake/dawn/kb/cve_2012_4466.rb +29 -0
  117. data/lib/codesake/dawn/kb/cve_2012_4481.rb +28 -0
  118. data/lib/codesake/dawn/kb/cve_2012_4522.rb +29 -0
  119. data/lib/codesake/dawn/kb/cve_2012_5370.rb +29 -0
  120. data/lib/codesake/dawn/kb/cve_2012_5371.rb +29 -0
  121. data/lib/codesake/dawn/kb/cve_2012_5380.rb +30 -0
  122. data/lib/codesake/dawn/kb/cve_2012_6109.rb +27 -0
  123. data/lib/codesake/dawn/kb/cve_2012_6134.rb +29 -0
  124. data/lib/codesake/dawn/kb/cve_2012_6496.rb +30 -0
  125. data/lib/codesake/dawn/kb/cve_2012_6497.rb +30 -0
  126. data/lib/codesake/dawn/kb/cve_2013_0155.rb +31 -0
  127. data/lib/codesake/dawn/kb/cve_2013_0156.rb +29 -0
  128. data/lib/codesake/dawn/kb/cve_2013_0162.rb +30 -0
  129. data/lib/codesake/dawn/kb/cve_2013_0175.rb +29 -0
  130. data/lib/codesake/dawn/kb/cve_2013_0183.rb +27 -0
  131. data/lib/codesake/dawn/kb/cve_2013_0184.rb +27 -0
  132. data/lib/codesake/dawn/kb/cve_2013_0233.rb +28 -0
  133. data/lib/codesake/dawn/kb/cve_2013_0256.rb +61 -0
  134. data/lib/codesake/dawn/kb/cve_2013_0262.rb +28 -0
  135. data/lib/codesake/dawn/kb/cve_2013_0263.rb +28 -0
  136. data/lib/codesake/dawn/kb/cve_2013_0269.rb +29 -0
  137. data/lib/codesake/dawn/kb/cve_2013_0276.rb +30 -0
  138. data/lib/codesake/dawn/kb/cve_2013_0277.rb +27 -0
  139. data/lib/codesake/dawn/kb/cve_2013_0284.rb +29 -0
  140. data/lib/codesake/dawn/kb/cve_2013_0285.rb +29 -0
  141. data/lib/codesake/dawn/kb/cve_2013_0333.rb +30 -0
  142. data/lib/codesake/dawn/kb/cve_2013_1607.rb +27 -0
  143. data/lib/codesake/dawn/kb/cve_2013_1655.rb +67 -0
  144. data/lib/codesake/dawn/kb/cve_2013_1656.rb +30 -0
  145. data/lib/codesake/dawn/kb/cve_2013_1756.rb +28 -0
  146. data/lib/codesake/dawn/kb/cve_2013_1800.rb +28 -0
  147. data/lib/codesake/dawn/kb/cve_2013_1801.rb +29 -0
  148. data/lib/codesake/dawn/kb/cve_2013_1802.rb +29 -0
  149. data/lib/codesake/dawn/kb/cve_2013_1812.rb +29 -0
  150. data/lib/codesake/dawn/kb/cve_2013_1821.rb +30 -0
  151. data/lib/codesake/dawn/kb/cve_2013_1854.rb +28 -0
  152. data/lib/codesake/dawn/kb/cve_2013_1855.rb +27 -0
  153. data/lib/codesake/dawn/kb/cve_2013_1856.rb +28 -0
  154. data/lib/codesake/dawn/kb/cve_2013_1857.rb +29 -0
  155. data/lib/codesake/dawn/kb/cve_2013_1875.rb +29 -0
  156. data/lib/codesake/dawn/kb/cve_2013_1898.rb +29 -0
  157. data/lib/codesake/dawn/kb/cve_2013_1911.rb +30 -0
  158. data/lib/codesake/dawn/kb/cve_2013_1933.rb +29 -0
  159. data/lib/codesake/dawn/kb/cve_2013_1947.rb +29 -0
  160. data/lib/codesake/dawn/kb/cve_2013_1948.rb +29 -0
  161. data/lib/codesake/dawn/kb/cve_2013_2065.rb +31 -0
  162. data/lib/codesake/dawn/kb/cve_2013_2090.rb +30 -0
  163. data/lib/codesake/dawn/kb/cve_2013_2105.rb +28 -0
  164. data/lib/codesake/dawn/kb/cve_2013_2119.rb +29 -0
  165. data/lib/codesake/dawn/kb/cve_2013_2512.rb +28 -0
  166. data/lib/codesake/dawn/kb/cve_2013_2513.rb +27 -0
  167. data/lib/codesake/dawn/kb/cve_2013_2516.rb +28 -0
  168. data/lib/codesake/dawn/kb/cve_2013_2615.rb +29 -0
  169. data/lib/codesake/dawn/kb/cve_2013_2616.rb +29 -0
  170. data/lib/codesake/dawn/kb/cve_2013_2617.rb +30 -0
  171. data/lib/codesake/dawn/kb/cve_2013_3221.rb +29 -0
  172. data/lib/codesake/dawn/kb/cve_2013_4164.rb +32 -0
  173. data/lib/codesake/dawn/kb/cve_2013_4203.rb +27 -0
  174. data/lib/codesake/dawn/kb/cve_2013_4389.rb +28 -0
  175. data/lib/codesake/dawn/kb/cve_2013_4413.rb +29 -0
  176. data/lib/codesake/dawn/kb/cve_2013_4457.rb +31 -0
  177. data/lib/codesake/dawn/kb/cve_2013_4478.rb +28 -0
  178. data/lib/codesake/dawn/kb/cve_2013_4479.rb +28 -0
  179. data/lib/codesake/dawn/kb/cve_2013_4489.rb +30 -0
  180. data/lib/codesake/dawn/kb/cve_2013_4491.rb +30 -0
  181. data/lib/codesake/dawn/kb/cve_2013_4492.rb +31 -0
  182. data/lib/codesake/dawn/kb/cve_2013_4562.rb +29 -0
  183. data/lib/codesake/dawn/kb/cve_2013_4593.rb +29 -0
  184. data/lib/codesake/dawn/kb/cve_2013_5647.rb +31 -0
  185. data/lib/codesake/dawn/kb/cve_2013_5671.rb +28 -0
  186. data/lib/codesake/dawn/kb/cve_2013_6414.rb +31 -0
  187. data/lib/codesake/dawn/kb/cve_2013_6415.rb +30 -0
  188. data/lib/codesake/dawn/kb/cve_2013_6416.rb +31 -0
  189. data/lib/codesake/dawn/kb/cve_2013_6417.rb +31 -0
  190. data/lib/codesake/dawn/kb/cve_2013_6421.rb +30 -0
  191. data/lib/codesake/dawn/kb/cve_2013_6459.rb +30 -0
  192. data/lib/codesake/dawn/kb/cve_2013_6460.rb +55 -0
  193. data/lib/codesake/dawn/kb/cve_2013_6461.rb +59 -0
  194. data/lib/codesake/dawn/kb/cve_2013_7086.rb +29 -0
  195. data/lib/codesake/dawn/kb/cve_2014_0036.rb +29 -0
  196. data/lib/codesake/dawn/kb/cve_2014_0080.rb +30 -0
  197. data/lib/codesake/dawn/kb/cve_2014_0081.rb +28 -0
  198. data/lib/codesake/dawn/kb/cve_2014_0082.rb +29 -0
  199. data/lib/codesake/dawn/kb/cve_2014_0130.rb +28 -0
  200. data/lib/codesake/dawn/kb/cve_2014_1233.rb +29 -0
  201. data/lib/codesake/dawn/kb/cve_2014_1234.rb +28 -0
  202. data/lib/codesake/dawn/kb/cve_2014_2322.rb +30 -0
  203. data/lib/codesake/dawn/kb/cve_2014_2525.rb +61 -0
  204. data/lib/codesake/dawn/kb/cve_2014_2538.rb +28 -0
  205. data/lib/codesake/dawn/kb/cve_2014_3482.rb +30 -0
  206. data/lib/codesake/dawn/kb/cve_2014_3483.rb +29 -0
  207. data/lib/codesake/dawn/kb/dependency_check.rb +86 -0
  208. data/lib/codesake/dawn/kb/deprecation_check.rb +40 -0
  209. data/lib/codesake/dawn/kb/not_revised_code.rb +24 -0
  210. data/lib/codesake/dawn/kb/operating_system_check.rb +98 -0
  211. data/lib/codesake/dawn/kb/osvdb_105971.rb +31 -0
  212. data/lib/codesake/dawn/kb/osvdb_108530.rb +29 -0
  213. data/lib/codesake/dawn/kb/osvdb_108563.rb +30 -0
  214. data/lib/codesake/dawn/kb/osvdb_108569.rb +30 -0
  215. data/lib/codesake/dawn/kb/osvdb_108570.rb +29 -0
  216. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet.rb +41 -0
  217. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/check_for_backup_files.rb +22 -0
  218. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/check_for_safe_redirect_and_forward.rb +59 -0
  219. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/command_injection.rb +30 -0
  220. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/csrf.rb +31 -0
  221. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/mass_assignment_in_model.rb +35 -0
  222. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/security_related_headers.rb +38 -0
  223. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/sensitive_files.rb +31 -0
  224. data/lib/codesake/dawn/kb/owasp_ror_cheatsheet/session_stored_in_database.rb +33 -0
  225. data/lib/codesake/dawn/kb/pattern_match_check.rb +129 -0
  226. data/lib/codesake/dawn/kb/ruby_version_check.rb +91 -0
  227. data/lib/codesake/dawn/kb/simpleform_xss_20131129.rb +30 -0
  228. data/lib/codesake/dawn/kb/version_check.rb +418 -0
  229. data/lib/codesake/dawn/knowledge_base.rb +513 -0
  230. data/lib/codesake/dawn/padrino.rb +82 -0
  231. data/lib/codesake/dawn/rails.rb +17 -0
  232. data/lib/codesake/dawn/railtie.rb +9 -0
  233. data/lib/codesake/dawn/reporter.rb +280 -0
  234. data/lib/codesake/dawn/sinatra.rb +129 -0
  235. data/lib/codesake/dawn/tasks.rb +27 -0
  236. data/lib/codesake/dawn/utils.rb +21 -0
  237. data/lib/codesake/dawn/version.rb +28 -0
  238. data/lib/tasks/codesake-dawn_tasks.rake +1 -0
  239. data/spec/lib/dawn/codesake_core_spec.rb +9 -0
  240. data/spec/lib/dawn/codesake_knowledgebase_spec.rb +940 -0
  241. data/spec/lib/dawn/codesake_padrino_engine_disabled.rb +45 -0
  242. data/spec/lib/dawn/codesake_rails_engine_disabled.rb +12 -0
  243. data/spec/lib/dawn/codesake_sinatra_engine_disabled.rb +128 -0
  244. data/spec/lib/kb/codesake_cve_2013_0175_spec.rb +35 -0
  245. data/spec/lib/kb/codesake_cve_2013_4457_spec.rb +41 -0
  246. data/spec/lib/kb/codesake_dependency_version_check_spec.rb +76 -0
  247. data/spec/lib/kb/codesake_deprecation_check_spec.rb +56 -0
  248. data/spec/lib/kb/codesake_ruby_version_check_spec.rb +40 -0
  249. data/spec/lib/kb/codesake_version_check_spec.rb +165 -0
  250. data/spec/lib/kb/cve_2011_2705_spec.rb +35 -0
  251. data/spec/lib/kb/cve_2011_2930_spec.rb +31 -0
  252. data/spec/lib/kb/cve_2011_3009_spec.rb +25 -0
  253. data/spec/lib/kb/cve_2011_3187_spec.rb +24 -0
  254. data/spec/lib/kb/cve_2011_4319_spec.rb +44 -0
  255. data/spec/lib/kb/cve_2011_5036_spec.rb +95 -0
  256. data/spec/lib/kb/cve_2012_1098_spec.rb +36 -0
  257. data/spec/lib/kb/cve_2012_2139_spec.rb +20 -0
  258. data/spec/lib/kb/cve_2012_2671_spec.rb +23 -0
  259. data/spec/lib/kb/cve_2012_6109_spec.rb +112 -0
  260. data/spec/lib/kb/cve_2013_0162_spec.rb +23 -0
  261. data/spec/lib/kb/cve_2013_0183_spec.rb +54 -0
  262. data/spec/lib/kb/cve_2013_0184_spec.rb +115 -0
  263. data/spec/lib/kb/cve_2013_0256_spec.rb +34 -0
  264. data/spec/lib/kb/cve_2013_0262_spec.rb +44 -0
  265. data/spec/lib/kb/cve_2013_0263_spec.rb +11 -0
  266. data/spec/lib/kb/cve_2013_1607_spec.rb +15 -0
  267. data/spec/lib/kb/cve_2013_1655_spec.rb +31 -0
  268. data/spec/lib/kb/cve_2013_1756_spec.rb +23 -0
  269. data/spec/lib/kb/cve_2013_2090_spec.rb +15 -0
  270. data/spec/lib/kb/cve_2013_2105_spec.rb +11 -0
  271. data/spec/lib/kb/cve_2013_2119_spec.rb +27 -0
  272. data/spec/lib/kb/cve_2013_2512_spec.rb +15 -0
  273. data/spec/lib/kb/cve_2013_2513_spec.rb +15 -0
  274. data/spec/lib/kb/cve_2013_2516_spec.rb +15 -0
  275. data/spec/lib/kb/cve_2013_4203_spec.rb +15 -0
  276. data/spec/lib/kb/cve_2013_4413_spec.rb +16 -0
  277. data/spec/lib/kb/cve_2013_4489_spec.rb +63 -0
  278. data/spec/lib/kb/cve_2013_4593_spec.rb +16 -0
  279. data/spec/lib/kb/cve_2013_5647_spec.rb +19 -0
  280. data/spec/lib/kb/cve_2013_5671_spec.rb +27 -0
  281. data/spec/lib/kb/cve_2013_6416_spec.rb +31 -0
  282. data/spec/lib/kb/cve_2013_6459_spec.rb +15 -0
  283. data/spec/lib/kb/cve_2013_7086_spec.rb +22 -0
  284. data/spec/lib/kb/cve_2014_0036_spec.rb +15 -0
  285. data/spec/lib/kb/cve_2014_0080_spec.rb +28 -0
  286. data/spec/lib/kb/cve_2014_0081_spec.rb +68 -0
  287. data/spec/lib/kb/cve_2014_0082_spec.rb +52 -0
  288. data/spec/lib/kb/cve_2014_0130_spec.rb +19 -0
  289. data/spec/lib/kb/cve_2014_1233_spec.rb +15 -0
  290. data/spec/lib/kb/cve_2014_1234_spec.rb +16 -0
  291. data/spec/lib/kb/cve_2014_2322_spec.rb +15 -0
  292. data/spec/lib/kb/cve_2014_2538_spec.rb +15 -0
  293. data/spec/lib/kb/cve_2014_3482_spec.rb +15 -0
  294. data/spec/lib/kb/cve_2014_3483_spec.rb +23 -0
  295. data/spec/lib/kb/osvdb_105971_spec.rb +15 -0
  296. data/spec/lib/kb/osvdb_108530_spec.rb +22 -0
  297. data/spec/lib/kb/osvdb_108563_spec.rb +18 -0
  298. data/spec/lib/kb/osvdb_108569_spec.rb +17 -0
  299. data/spec/lib/kb/osvdb_108570_spec.rb +17 -0
  300. data/spec/lib/kb/owasp_ror_cheatsheet_disabled.rb +56 -0
  301. data/spec/spec_helper.rb +11 -0
  302. data/support/bootstrap.js +2027 -0
  303. data/support/bootstrap.min.css +9 -0
  304. data/support/codesake.css +63 -0
  305. metadata +659 -0
  306. metadata.gz.sig +0 -0
@@ -0,0 +1,36 @@
1
+ Feature: dawn reports security issues
2
+ When it scans a sinatra application that it is not updated and it has XSS
3
+
4
+ Scenario: dawn detects the sinatra version
5
+ Given a vulnerable sinatra application exists
6
+ When I run `bundle exec dawn /tmp/sinatra-vulnerable`
7
+ Then the stdout should contain "1.2.6"
8
+
9
+ Scenario: dawn tells there are no vulnerabilities
10
+ Given a vulnerable sinatra application exists
11
+ When I run `bundle exec dawn /tmp/sinatra-vulnerable`
12
+ Then the stdout should contain "4 vulnerabilities found"
13
+ And the stdout should contain "Not revised code failed"
14
+ And the stdout should contain "CVE-2013-0269 failed"
15
+ And the stdout should contain "CVE-2013-1800 failed"
16
+ And the stdout should contain "1 reflected XSS found"
17
+ And the stdout should contain "request parameter \"name\""
18
+
19
+ # Test for --output json
20
+ Scenario: dawn can give a brief json output as well
21
+ Given a vulnerable sinatra application exists
22
+ When I run `bundle exec dawn -s /tmp/sinatra-vulnerable --output json`
23
+ Then the stdout should contain "{\"status\":"OK",\"target\":"/tmp/sinatra-vulnerable",\"mvc\":"sinatra",\"mvc_version\":"1.2.6",\"vulnerabilities_count\":4,\"vulnerabilities\":["Not revised code","CVE-2013-0269","CVE-2013-1800"],\"mitigated_vuln_count\":0,\"mitigated_vuln\":[],\"reflected_xss\":["request parameter \"name\""]}"
24
+
25
+
26
+ # Tests for --count-only option
27
+ Scenario: dawn can give just the number of issues found as output
28
+ Given a vulnerable sinatra application exists
29
+ When I run `bundle exec dawn --count-only -s /tmp/sinatra-vulnerable`
30
+ Then the stdout should contain "4"
31
+
32
+ Scenario: dawn can give just the number of issues found as output
33
+ Given a vulnerable sinatra application exists
34
+ When I run `bundle exec dawn --count-only -s /tmp/sinatra-vulnerable --output json`
35
+ Then the stdout should contain "{\"status\":"OK",\"vulnerabilities_count\":4}"
36
+
@@ -0,0 +1,19 @@
1
+ Given /^the generic project "(.*?)" doesn't exist$/ do |file|
2
+ FileUtils.rm(file) if File.exists?(file)
3
+ end
4
+
5
+ Given /^the hello world rails project does exist$/ do
6
+ system("rm -rf /tmp/hello_world_3.2.13")
7
+ system("cp -a ./spec/support/hello_world_3.2.13 /tmp")
8
+ end
9
+
10
+ Given /^a safe sinatra application exists$/ do
11
+ system("rm -rf /tmp/sinatra-safe")
12
+ system("cp -a ./spec/support/sinatra-safe /tmp")
13
+ end
14
+
15
+ Given /^a vulnerable sinatra application exists$/ do
16
+ system("rm -rf /tmp/sinatra-vulnerable")
17
+ system("cp -a ./spec/support/sinatra-vulnerable /tmp")
18
+ end
19
+
@@ -0,0 +1 @@
1
+ require 'aruba/cucumber'
@@ -0,0 +1,12 @@
1
+ require "codesake/dawn/utils"
2
+ require "codesake/dawn/core"
3
+ require "codesake/dawn/version"
4
+ require "codesake/dawn/knowledge_base"
5
+ require "codesake/dawn/rails"
6
+ require "codesake/dawn/sinatra"
7
+ require "codesake/dawn/padrino"
8
+ require "codesake/dawn/gemfile_lock"
9
+ require "codesake/dawn/reporter"
10
+ require "codesake-commons"
11
+
12
+ require "date"
@@ -0,0 +1,175 @@
1
+ require "yaml"
2
+
3
+ module Codesake
4
+ module Dawn
5
+ class Core
6
+
7
+ # TODO.20140326
8
+ # All those methods must moved from here to Util class and a
9
+ # Codesake::Dawn::Core namespace must be created.
10
+ def self.help
11
+ puts "Usage: dawn [options] target_directory"
12
+ printf "\nExamples:\n"
13
+ puts "\t$ dawn a_sinatra_webapp_directory"
14
+ puts "\t$ dawn -C the_rails_blog_engine"
15
+ puts "\t$ dawn -C --json a_sinatra_webapp_directory"
16
+ puts "\t$ dawn --ascii-tabular-report my_rails_blog_ecommerce"
17
+ puts "\t$ dawn --html -F my_report.html my_rails_blog_ecommerce"
18
+ printf "\n -r, --rails\t\t\t\t\tforce dawn to consider the target a rails application"
19
+ printf "\n -s, --sinatra\t\t\t\tforce dawn to consider the target a sinatra application"
20
+ printf "\n -p, --padrino\t\t\t\tforce dawn to consider the target a padrino application"
21
+ printf "\n -G, --gem-lock\t\t\t\tforce dawn to scan only for vulnerabilities affecting dependencies in Gemfile.lock"
22
+ printf "\n -a, --ascii-tabular-report\t\t\tcause dawn to format findings using table in ascii art"
23
+ printf "\n -j, --json\t\t\t\t\tcause dawn to format findings using json"
24
+ printf "\n -C, --count-only\t\t\t\tdawn will only count vulnerabilities (useful for scripts)"
25
+ printf "\n -z, --exit-on-warn\t\t\t\tdawn will return number of found vulnerabilities as exit code"
26
+ printf "\n -F, --file filename\t\t\t\ttells dawn to write output to filename"
27
+ printf "\n -c, --config-file filename\t\t\ttells dawn to load configuration from filename"
28
+ printf "\n\nDisable security check family\n"
29
+ printf "\n --disable-cve-bulletins\t\t\tdisable all CVE security checks"
30
+ printf "\n --disable-code-quality\t\t\tdisable all code quality checks"
31
+ printf "\n --disable-code-style\t\t\tdisable all code style checks"
32
+ printf "\n --disable-owasp-ror-cheatsheet\t\tdisable all Owasp Ruby on Rails cheatsheet checks"
33
+ printf "\n --disable-owasp-top-10\t\t\tdisable all Owasp Top 10 checks"
34
+ printf "\n\nFlags useful to query Codesake::Dawn\n"
35
+ printf "\n -S, --search-knowledge-base [check_name]\tsearch check_name in the knowledge base"
36
+ printf "\n --list-knowledge-base\t\t\tlist knowledge-base content"
37
+ printf "\n --list-known-families\t\t\tlist security check families contained in dawn's knowledge base"
38
+ printf "\n --list-known-framework\t\t\tlist ruby MVC frameworks supported by dawn"
39
+ printf "\n\nService flags\n"
40
+ printf "\n -D, --debug\t\t\t\t\tenters dawn debug mode"
41
+ printf "\n -V, --verbose\t\t\t\tthe output will be more verbose"
42
+ printf "\n -v, --version\t\t\t\tshow version information"
43
+ printf "\n -h, --help\t\t\t\t\tshow this help\n"
44
+
45
+ true
46
+ end
47
+
48
+ def self.dump_knowledge_base(verbose = false)
49
+ kb = Codesake::Dawn::KnowledgeBase.new
50
+ lines = []
51
+ lines << "Security checks currently supported:\n"
52
+
53
+ kb.all.each do |check|
54
+ if verbose
55
+ lines << "Name: #{check.name}\tCVSS: #{check.cvss_score}\tReleased: #{check.release_date}"
56
+ lines << "Description\n#{check.message}"
57
+ lines << "Remediation\n#{check.remediation}\n\n"
58
+ else
59
+ lines << "#{check.name}"
60
+ end
61
+ end
62
+ lines << "-----\nTotal: #{kb.all.count}"
63
+
64
+ lines.empty? ? 0 : lines.compact.join("\n")
65
+
66
+ end
67
+
68
+ # guess_mvc is very close to detect_mvc despite it accepts a
69
+ # filename as input and it tries to guess the mvc framework used from the
70
+ # gems it founds in Gemfile.lock without creating an engine.
71
+
72
+ def self.guess_mvc(gemfile_lock)
73
+ ret = {:name=>"", :version=>"", :connected_gems=>[]}
74
+
75
+ a = []
76
+ my_dir = Dir.pwd
77
+ Dir.chdir(File.dirname(gemfile_lock))
78
+ raise ArgumentError.new("can't read #{gemfile_lock}") unless File.readable?(File.basename(gemfile_lock))
79
+
80
+ lockfile = Bundler::LockfileParser.new(Bundler.read_file(File.basename(gemfile_lock)))
81
+ Dir.chdir(my_dir)
82
+ lockfile.specs.each do |s|
83
+ ret = {:name=>s.name, :version=>s.version.to_s} if s.name == "rails" || s.name == "sinatra"
84
+ a << {:name=>s.name, :version=>s.version.to_s}
85
+ end
86
+
87
+ ret[:connected_gems]=a
88
+ ret
89
+
90
+ end
91
+
92
+ def self.detect_mvc(target)
93
+
94
+ raise ArgumentError.new("you must set target directory") if target.nil?
95
+
96
+ my_dir = Dir.pwd
97
+ Dir.chdir(target)
98
+ raise ArgumentError.new("no Gemfile.lock in #{target}") unless File.exist?("Gemfile.lock")
99
+
100
+ lockfile = Bundler::LockfileParser.new(Bundler.read_file("Gemfile.lock"))
101
+ Dir.chdir(my_dir)
102
+ lockfile.specs.each do |s|
103
+ return Codesake::Dawn::Rails.new(target) if s.name == "rails"
104
+ return Codesake::Dawn::Padrino.new(target) if s.name == "padrino"
105
+ end
106
+
107
+ return Codesake::Dawn::Sinatra.new(target)
108
+ end
109
+
110
+ def self.is_good_target?(target)
111
+ (File.exist?(target) and File.directory?(target))
112
+ end
113
+
114
+ def self.find_conf(create_if_none = false)
115
+ conf_name = 'codesake-dawn.yaml'
116
+ path_order = [
117
+ './',
118
+ '~/',
119
+ '/usr/local/etc/',
120
+ ]
121
+ path_order.each do |p|
122
+ fn = p + conf_name if p.start_with?('/')
123
+ # if outside $HOME the config file must be hidden
124
+ fn = File.expand_path(p) + '/.'+conf_name if ! p.start_with?('/')
125
+ return fn if File.exist?(fn)
126
+ end
127
+
128
+ # Codesake::Dawn didn't find a config file.
129
+ # If create_if_none flag is set to false, than I'll return nil so the
130
+ # read_conf method will return the default configuration
131
+ return nil unless create_if_none
132
+
133
+ # If create_if_none flag is set to true, than I'll create a config file
134
+ # on the current directory with the default configuration.
135
+ conf = {"config"=>{:verbose=>false, :output=>"console", :mvc=>"", :gemfile_scan=>false, :gemfile_name=>"", :filename=>nil, :debug=>false, :exit_on_warn => false, :enabled_checks=> Codesake::Dawn::Kb::BasicCheck::ALLOWED_FAMILIES}}
136
+
137
+ # Calculate the conf file path
138
+ conf_path = File.expand_path('~') +'/.'+conf_name
139
+
140
+ # Open the conf file and write our default config to it
141
+ File.open(conf_path, 'w') do |f|
142
+ rv = f.write(YAML.dump(conf))
143
+ end
144
+
145
+ conf_path
146
+ end
147
+
148
+ def self.read_conf(file=nil)
149
+ conf = {:verbose=>false, :output=>"console", :mvc=>"", :gemfile_scan=>false, :gemfile_name=>"", :filename=>nil, :debug=>false, :exit_on_warn => false, :enabled_checks=> Codesake::Dawn::Kb::BasicCheck::ALLOWED_FAMILIES}
150
+ begin
151
+ return conf if file.nil?
152
+ file = file.chop if (not file.nil? and file.end_with? '/')
153
+ return conf if ! File.exist?(file)
154
+ rescue => e
155
+ $logger.err "it seems you've found a bug in core.rb@#{__LINE__}: #{e.message}"
156
+ return conf
157
+ end
158
+
159
+ c = YAML.load_file(file)
160
+
161
+ cf = c["config"]
162
+ cc = cf[:enabled_checks]
163
+
164
+ # TODO
165
+ # I must add some sanity check here
166
+ conf[:verbose] = cf["verbose"] unless cf["verbose"].nil?
167
+ conf[:debug] = cf["debug"] unless cf["debug"].nil?
168
+ conf[:output] = cf["output"] unless cf["output"].nil?
169
+ conf[:enabled_checks] = cc unless cc.nil?
170
+
171
+ return conf
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,380 @@
1
+ require 'bundler'
2
+
3
+ module Codesake
4
+ module Dawn
5
+ module Engine
6
+ include Codesake::Dawn::Utils
7
+
8
+ attr_reader :target
9
+ attr_reader :name
10
+ attr_reader :scan_start
11
+ attr_reader :scan_stop
12
+ # This attribute is used when @name == "Gemfile.lock" to force the
13
+ # loading of specific MVC checks
14
+ attr_reader :force
15
+ attr_reader :gemfile_lock
16
+ attr_reader :mvc_version
17
+ attr_reader :connected_gems
18
+ attr_reader :checks
19
+ attr_reader :vulnerabilities
20
+ attr_reader :mitigated_issues
21
+ attr_reader :ruby_version
22
+
23
+ attr_reader :engine_error
24
+
25
+ attr_reader :reflected_xss
26
+
27
+ # Typical MVC elements here
28
+
29
+ # Each view will be something like {:filename=>"target/views/index.haml", :language=>:haml}
30
+ attr_reader :views
31
+
32
+ # Each controller will be a little bit more complex. Of course for
33
+ # Sinatra, the controller filename will be the sole web application ruby
34
+ # file.
35
+ # {:filename=>"target/controllers/this_controller.rb", :actions=>[{:name=>"index", :method=>:get, :map=>"/"]}
36
+ attr_reader :controllers
37
+
38
+ # Models I don't know right now. Let them initialized as Array... we
39
+ # will see later
40
+ attr_reader :models
41
+
42
+ attr_accessor :debug
43
+
44
+ attr_reader :applied_checks
45
+ attr_reader :skipped_checks
46
+
47
+ def initialize(dir=nil, name="", options={})
48
+ @name = name
49
+ @scan_start = Time.now
50
+ @scan_stop = @scan_start
51
+ @mvc_version = ""
52
+ @gemfile_lock = ""
53
+ @force = ""
54
+ @connected_gems = []
55
+ @checks = []
56
+ @vulnerabilities = []
57
+ @mitigated_issues = []
58
+ @applied = []
59
+ @reflected_xss = []
60
+ @engine_error = false
61
+ @debug = false
62
+ @debug = options[:debug] unless options[:debug].nil?
63
+ @applied_checks = 0
64
+ @skipped_checks = 0
65
+ @gemfile_lock_sudo = false
66
+
67
+ set_target(dir) unless dir.nil?
68
+ @ruby_version = get_ruby_version if dir.nil?
69
+ @gemfile_lock = options[:gemfile_name] unless options[:gemfile_name].nil?
70
+
71
+ @views = detect_views
72
+ @controllers = detect_controllers
73
+ @models = detect_models
74
+
75
+ if $logger.nil?
76
+ $logger = Codesake::Commons::Logging.instance
77
+ $logger.helo "dawn-engine", Codesake::Dawn::VERSION
78
+
79
+ end
80
+ $logger.warn "pattern matching security checks are disabled for Gemfile.lock scan" if @name == "Gemfile.lock"
81
+ $logger.warn "combo security checks are disabled for Gemfile.lock scan" if @name == "Gemfile.lock"
82
+ debug_me "engine is in debug mode"
83
+
84
+ if @name == "Gemfile.lock" && ! options[:guessed_mvc].nil?
85
+ # since all checks relies on @name a Gemfile.lock engine must
86
+ # impersonificate the engine for the mvc it was detected
87
+ debug_me "now I'm switching my name from #{@name} to #{options[:guessed_mvc][:name]}"
88
+ $logger.err "there are no connected gems... it seems Gemfile.lock parsing failed" if options[:guessed_mvc][:connected_gems].empty?
89
+ @name = options[:guessed_mvc][:name]
90
+ @mvc_version = options[:guessed_mvc][:version]
91
+ @connected_gems = options[:guessed_mvc][:connected_gems]
92
+ @gemfile_lock_sudo = true
93
+ end
94
+
95
+ # FIXME.20140325
96
+ #
97
+ # I comment out this call. knowledge base must be called explicitly
98
+ # since it's now possible to pass an array saying check families to be
99
+ # loaded.
100
+ #
101
+ # load_knowledge_base
102
+ end
103
+
104
+ def detect_views
105
+ []
106
+ end
107
+ def error!
108
+ @error = true
109
+ end
110
+ def error?
111
+ @error
112
+ end
113
+
114
+ def build_view_array(dir)
115
+
116
+ return [] unless File.exist?(dir) and File.directory?(dir)
117
+
118
+ ret = []
119
+ Dir.glob(File.join("#{dir}", "*")).each do |filename|
120
+ ret << {:filename=>filename, :language=>:haml} if File.extname(filename) == ".haml"
121
+ end
122
+
123
+ ret
124
+ end
125
+
126
+ def detect_controllers
127
+ []
128
+ end
129
+
130
+ def detect_models
131
+ []
132
+ end
133
+
134
+ def get_ruby_version
135
+ unless @target.nil?
136
+
137
+ # does target use rbenv?
138
+ ver = get_rbenv_ruby_ver
139
+ # does the target use rvm?
140
+ ver = get_rvm_ruby_ver if ver[:version].empty? && ver[:patchlevel].empty?
141
+ # take the running ruby otherwise
142
+ ver = {:engine=>RUBY_ENGINE, :version=>RUBY_VERSION, :patchlevel=>"p#{RUBY_PATCHLEVEL}"} if ver[:version].empty? && ver[:patchlevel].empty?
143
+ else
144
+ ver = {:engine=>RUBY_ENGINE, :version=>RUBY_VERSION, :patchlevel=>"p#{RUBY_PATCHLEVEL}"}
145
+
146
+ end
147
+
148
+ ver
149
+ end
150
+
151
+ def set_target(dir)
152
+ @target = dir
153
+ @gemfile_lock = File.join(@target, "Gemfile.lock")
154
+ @mvc_version = set_mvc_version
155
+ @ruby_version = get_ruby_version
156
+ end
157
+
158
+ def target_is_dir?
159
+ File.directory?(@target)
160
+ end
161
+
162
+ def load_knowledge_base(enabled_checks=[])
163
+ debug_me("load_knowledge_base called. Enabled checks are: #{enabled_checks}")
164
+ if @name == "Gemfile.lock"
165
+ @checks = Codesake::Dawn::KnowledgeBase.new({:enabled_checks=>enabled_checks}).all if @force.empty?
166
+ @checks = Codesake::Dawn::KnowledgeBase.new({:enabled_checks=>enabled_checks}).all_by_mvc(@force) unless @force.empty?
167
+ else
168
+ @checks = Codesake::Dawn::KnowledgeBase.new({:enabled_checks=>enabled_checks}).all_by_mvc(@name)
169
+
170
+ end
171
+ debug_me("#{@checks.count} checks loaded")
172
+ @checks
173
+ end
174
+
175
+
176
+
177
+ def set_mvc_version
178
+ ver = ""
179
+ return ver unless target_is_dir?
180
+ return ver unless has_gemfile_lock?
181
+
182
+ my_dir = Dir.pwd
183
+ Dir.chdir(@target)
184
+ lockfile = Bundler::LockfileParser.new(Bundler.read_file("Gemfile.lock"))
185
+ lockfile.specs.each do |s|
186
+ # detecting MVC version using @name in case of sinatra, padrino or rails engine
187
+ ver= s.version.to_s if s.name == @name && @name != "Gemfile.lock"
188
+ # detecting MVC version using @force in case of Gemfile.lock engine
189
+ ver= s.version.to_s if s.name == @force.to_s && @name == "Gemfile.lock"
190
+ @connected_gems << {:name=>s.name, :version=>s.version.to_s}
191
+ end
192
+ Dir.chdir(my_dir)
193
+ return ver
194
+ end
195
+
196
+ def has_gemfile_lock?
197
+ File.exist?(@gemfile_lock)
198
+ end
199
+
200
+ def is_good_mvc?
201
+ (@mvc_version != "")
202
+ end
203
+
204
+ def can_apply?
205
+ target_is_dir? && is_good_mvc?
206
+ end
207
+
208
+ def get_mvc_version
209
+ "#{@mvc_version}" if is_good_mvc?
210
+ end
211
+
212
+ ## Security stuff applies here
213
+ #
214
+ # Public it applies a single security check given by its name
215
+ #
216
+ # name - the security check to be applied
217
+ #
218
+ # Examples
219
+ #
220
+ # engine.apply("CVE-2013-1800")
221
+ # # => boolean
222
+ #
223
+ # Returns a true value if the security check was successfully applied or false
224
+ # otherwise
225
+ def apply(name)
226
+
227
+ # FIXME.20140325
228
+ # Now if no checks are loaded because knowledge base was not previously called, apply and apply_all proudly refuse to run.
229
+ # Reason is simple, load_knowledge_base now needs enabled check array
230
+ # and I don't want to pollute engine API to propagate this value. It's
231
+ # a param to load_knowledge_base and then bin/dawn calls it
232
+ # accordingly.
233
+ # load_knowledge_base if @checks.nil?
234
+ if @checks.nil?
235
+ $logger.err "you must load knowledge base before trying to apply security checks"
236
+ return false
237
+ end
238
+
239
+ return false if @checks.empty?
240
+
241
+ @checks.each do |check|
242
+ if check.name == name
243
+ unless ((check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK || check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK ) && @name == "Gemfile.lock")
244
+ debug_me "applying check #{check.name}"
245
+ @applied_checks += 1
246
+ @applied << { :name=>name }
247
+ check.ruby_version = @ruby_version[:version]
248
+ check.detected_ruby = @ruby_version if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
249
+ check.dependencies = self.connected_gems if check.kind == Codesake::Dawn::KnowledgeBase::DEPENDENCY_CHECK
250
+ check.root_dir = self.target if check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK
251
+ check.options = {:detected_ruby => self.ruby_version, :dependencies => self.connected_gems, :root_dir => self.target } if check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
252
+
253
+ check_vuln = check.vuln?
254
+
255
+ @vulnerabilities << {:name=> check.name, :severity=>check.severity, :priority=>check.priority, :kind=>check.check_family, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check_vuln && check.kind != Codesake::Dawn::KnowledgeBase::COMBO_CHECK
256
+
257
+ @vulnerabilities << {:name=> check.name, :severity=>check.severity, :priority=>check.priority, :kind=>check.check_family, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>check.vulnerable_checks} if check_vuln && check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
258
+
259
+ @mitigated_issues << {:name=> check.name, :severity=>check.severity, :priority=>check.priority, :kind=>check.check_family, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check.mitigated?
260
+ return true
261
+ else
262
+ debug_me "skipping check #{check.name}"
263
+ @skipped_checks += 1
264
+ end
265
+ end
266
+ end
267
+
268
+ false
269
+ end
270
+
271
+ def apply_all
272
+ @scan_start = Time.now
273
+ debug_me("SCAN STARTED: #{@scan_start}")
274
+ # FIXME.20140325
275
+ # Now if no checks are loaded because knowledge base was not previously called, apply and apply_all proudly refuse to run.
276
+ # Reason is simple, load_knowledge_base now needs enabled check array
277
+ # and I don't want to pollute engine API to propagate this value. It's
278
+ # a param to load_knowledge_base and then bin/dawn calls it
279
+ # accordingly.
280
+ # load_knowledge_base if @checks.nil?
281
+ if @checks.nil?
282
+ $logger.err "you must load knowledge base before trying to apply security checks"
283
+ @scan_stop = Time.now
284
+ debug_me("SCAN STOPPED: #{@scan_stop}")
285
+ return false
286
+ end
287
+ if @checks.empty?
288
+ @scan_stop = Time.now
289
+ debug_me("SCAN STOPPED: #{@scan_stop}")
290
+ return false
291
+ end
292
+
293
+ @checks.each do |check|
294
+ unless ((check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK || check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK ) && @gemfile_lock_sudo)
295
+
296
+ @applied << { :name => name }
297
+ debug_me "applying check #{check.name}"
298
+ @applied_checks += 1
299
+
300
+ check.ruby_version = @ruby_version[:version]
301
+ check.detected_ruby = @ruby_version if check.kind == Codesake::Dawn::KnowledgeBase::RUBY_VERSION_CHECK
302
+ check.dependencies = self.connected_gems if check.kind == Codesake::Dawn::KnowledgeBase::DEPENDENCY_CHECK
303
+ check.root_dir = self.target if check.kind == Codesake::Dawn::KnowledgeBase::PATTERN_MATCH_CHECK
304
+ check.options = {:detected_ruby => self.ruby_version, :dependencies => self.connected_gems, :root_dir => self.target } if check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
305
+ check_vuln = check.vuln?
306
+
307
+ @vulnerabilities << {:name=> check.name, :severity=>check.severity, :priority=>check.priority, :kind=>check.check_family, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check_vuln && check.kind != Codesake::Dawn::KnowledgeBase::COMBO_CHECK
308
+
309
+ @vulnerabilities << {:name=> check.name, :severity=>check.severity, :priority=>check.priority, :kind=>check.check_family, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>check.vulnerable_checks} if check_vuln && check.kind == Codesake::Dawn::KnowledgeBase::COMBO_CHECK
310
+
311
+ @mitigated_issues << {:name=> check.name, :severity=>check.severity, :priority=>check.priority, :kind=>check.check_family, :message=>check.message, :remediation=>check.remediation, :evidences=>check.evidences, :vulnerable_checks=>nil} if check.mitigated?
312
+ else
313
+ debug_me "skipping check #{check.name}"
314
+ @skipped_checks += 1
315
+ end
316
+ end
317
+ @scan_stop = Time.now
318
+ debug_me("SCAN STOPPED: #{@scan_stop}")
319
+
320
+ true
321
+
322
+ end
323
+
324
+ def scan_time
325
+ @scan_stop - @scan_start
326
+ end
327
+
328
+ def is_applied?(name)
329
+ @applied.each do |a|
330
+ return true if a[:name] == name
331
+ end
332
+ return false
333
+ end
334
+
335
+ def vulnerabilities
336
+ apply_all if @applied.empty?
337
+ @vulnerabilities
338
+ end
339
+
340
+ def find_vulnerability_by_name(name)
341
+ apply(name) unless is_applied?(name)
342
+ @vulnerabilities.each do |v|
343
+ return v if v[:name] == name
344
+ end
345
+
346
+ nil
347
+ end
348
+
349
+ def is_vulnerable_to?(name)
350
+ return (find_vulnerability_by_name(name) != nil)
351
+ end
352
+
353
+
354
+ def has_reflected_xss?
355
+ (@reflected_xss.count != 0) unless @reflected_xss.nil?
356
+ end
357
+
358
+ def count_vulnerabilities
359
+ ret = 0
360
+ ret = @vulnerabilities.count unless @vulnerabilities.nil?
361
+ ret += @reflected_xss.count unless @reflected_xss.nil?
362
+
363
+ ret
364
+ end
365
+
366
+ private
367
+ def get_rbenv_ruby_ver
368
+ return {:version=>"", :patchlevel=>""} unless File.exist?(File.join(@target, ".rbenv-version"))
369
+ hash = File.read(File.join(@target, '.rbenv-version')).split('-')
370
+ return {:version=>hash[0], :patchlevel=>hash[1]}
371
+ end
372
+ def get_rvm_ruby_ver
373
+ return {:version=>"", :patchlevel=>""} unless File.exist?(File.join(@target, ".ruby-version"))
374
+ hash = File.read(File.join(@target, '.ruby-version')).split('-')
375
+ return {:version=>hash[0], :patchlevel=>hash[1]}
376
+ end
377
+
378
+ end
379
+ end
380
+ end