contrast-agent 3.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.clang-format +5 -0
- data/.dockerignore +10 -0
- data/.gitignore +58 -0
- data/.gitmodules +6 -0
- data/.rspec +6 -0
- data/.simplecov +4 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +12 -0
- data/Rakefile +15 -0
- data/exe/contrast_service +29 -0
- data/ext/build_funchook.rb +48 -0
- data/ext/cs__assess_active_record_named/cs__active_record_named.c +47 -0
- data/ext/cs__assess_active_record_named/cs__active_record_named.h +10 -0
- data/ext/cs__assess_active_record_named/extconf.rb +2 -0
- data/ext/cs__assess_array/cs__assess_array.c +38 -0
- data/ext/cs__assess_array/cs__assess_array.h +9 -0
- data/ext/cs__assess_array/extconf.rb +2 -0
- data/ext/cs__assess_basic_object/cs__assess_basic_object.c +50 -0
- data/ext/cs__assess_basic_object/cs__assess_basic_object.h +17 -0
- data/ext/cs__assess_basic_object/extconf.rb +2 -0
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.c +86 -0
- data/ext/cs__assess_fiber_track/cs__assess_fiber_track.h +34 -0
- data/ext/cs__assess_fiber_track/extconf.rb +2 -0
- data/ext/cs__assess_hash/cs__assess_hash.c +64 -0
- data/ext/cs__assess_hash/cs__assess_hash.h +24 -0
- data/ext/cs__assess_hash/extconf.rb +2 -0
- data/ext/cs__assess_kernel/cs__assess_kernel.c +36 -0
- data/ext/cs__assess_kernel/cs__assess_kernel.h +10 -0
- data/ext/cs__assess_kernel/extconf.rb +2 -0
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.c +47 -0
- data/ext/cs__assess_marshal_module/cs__assess_marshal_module.h +18 -0
- data/ext/cs__assess_marshal_module/extconf.rb +2 -0
- data/ext/cs__assess_module/cs__assess_module.c +78 -0
- data/ext/cs__assess_module/cs__assess_module.h +25 -0
- data/ext/cs__assess_module/extconf.rb +2 -0
- data/ext/cs__assess_regexp/cs__assess_regexp.c +48 -0
- data/ext/cs__assess_regexp/cs__assess_regexp.h +22 -0
- data/ext/cs__assess_regexp/extconf.rb +2 -0
- data/ext/cs__assess_regexp_track/cs__assess_regexp_track.c +63 -0
- data/ext/cs__assess_regexp_track/cs__assess_regexp_track.h +29 -0
- data/ext/cs__assess_regexp_track/extconf.rb +2 -0
- data/ext/cs__assess_string/cs__assess_string.c +38 -0
- data/ext/cs__assess_string/cs__assess_string.h +19 -0
- data/ext/cs__assess_string/extconf.rb +2 -0
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.c +31 -0
- data/ext/cs__assess_string_interpolation26/cs__assess_string_interpolation26.h +13 -0
- data/ext/cs__assess_string_interpolation26/extconf.rb +2 -0
- data/ext/cs__common/cs__common.c +60 -0
- data/ext/cs__common/cs__common.h +28 -0
- data/ext/cs__common/extconf.rb +20 -0
- data/ext/cs__contrast_patch/cs__contrast_patch.c +445 -0
- data/ext/cs__contrast_patch/cs__contrast_patch.h +196 -0
- data/ext/cs__contrast_patch/extconf.rb +2 -0
- data/ext/cs__protect_kernel/cs__protect_kernel.c +37 -0
- data/ext/cs__protect_kernel/cs__protect_kernel.h +11 -0
- data/ext/cs__protect_kernel/extconf.rb +2 -0
- data/ext/cs__scope/cs__scope.c +96 -0
- data/ext/cs__scope/cs__scope.h +33 -0
- data/ext/cs__scope/extconf.rb +2 -0
- data/ext/extconf_common.rb +49 -0
- data/funchook/LICENSE +360 -0
- data/funchook/Makefile +29 -0
- data/funchook/Makefile.in +29 -0
- data/funchook/README.md +121 -0
- data/funchook/appveyor.yml +42 -0
- data/funchook/autogen.sh +3 -0
- data/funchook/autom4te.cache/output.0 +4976 -0
- data/funchook/autom4te.cache/requests +78 -0
- data/funchook/autom4te.cache/traces.0 +364 -0
- data/funchook/config.guess +1530 -0
- data/funchook/config.log +490 -0
- data/funchook/config.status +1016 -0
- data/funchook/config.sub +1773 -0
- data/funchook/configure +4976 -0
- data/funchook/configure.ac +59 -0
- data/funchook/distorm/COPYING +26 -0
- data/funchook/distorm/MANIFEST +25 -0
- data/funchook/distorm/MANIFEST.in +4 -0
- data/funchook/distorm/README.md +12 -0
- data/funchook/distorm/disOps/disOps.py +795 -0
- data/funchook/distorm/disOps/x86db.py +404 -0
- data/funchook/distorm/disOps/x86header.py +247 -0
- data/funchook/distorm/disOps/x86sets.py +1664 -0
- data/funchook/distorm/examples/cs/TestdiStorm/Program.cs +79 -0
- data/funchook/distorm/examples/cs/TestdiStorm/Properties/AssemblyInfo.cs +36 -0
- data/funchook/distorm/examples/cs/TestdiStorm/TestdiStorm.csproj +69 -0
- data/funchook/distorm/examples/cs/distorm-net.sln +26 -0
- data/funchook/distorm/examples/cs/distorm-net/CodeInfo.cs +23 -0
- data/funchook/distorm/examples/cs/distorm-net/DecodedInst.cs +15 -0
- data/funchook/distorm/examples/cs/distorm-net/DecodedResult.cs +14 -0
- data/funchook/distorm/examples/cs/distorm-net/DecomposedInst.cs +36 -0
- data/funchook/distorm/examples/cs/distorm-net/DecomposedResult.cs +14 -0
- data/funchook/distorm/examples/cs/distorm-net/Opcodes.cs +1268 -0
- data/funchook/distorm/examples/cs/distorm-net/Opcodes.tt +37 -0
- data/funchook/distorm/examples/cs/distorm-net/Operand.cs +25 -0
- data/funchook/distorm/examples/cs/distorm-net/Properties/AssemblyInfo.cs +36 -0
- data/funchook/distorm/examples/cs/distorm-net/diStorm3.cs +411 -0
- data/funchook/distorm/examples/cs/distorm-net/distorm-net.csproj +80 -0
- data/funchook/distorm/examples/cs/readme +3 -0
- data/funchook/distorm/examples/ddk/README +48 -0
- data/funchook/distorm/examples/ddk/distorm.ini +11 -0
- data/funchook/distorm/examples/ddk/dummy.c +15 -0
- data/funchook/distorm/examples/ddk/main.c +91 -0
- data/funchook/distorm/examples/ddk/makefile +1 -0
- data/funchook/distorm/examples/ddk/sources +10 -0
- data/funchook/distorm/examples/java/Makefile +23 -0
- data/funchook/distorm/examples/java/distorm/src/Main.java +43 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/CodeInfo.java +27 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecodedInst.java +32 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecodedResult.java +11 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecomposedInst.java +89 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/DecomposedResult.java +11 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/OpcodeEnum.java +131 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/Opcodes.java +1123 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/Operand.java +24 -0
- data/funchook/distorm/examples/java/distorm/src/diStorm3/distorm3.java +41 -0
- data/funchook/distorm/examples/java/jdistorm.c +405 -0
- data/funchook/distorm/examples/java/jdistorm.h +40 -0
- data/funchook/distorm/examples/java/jdistorm.sln +20 -0
- data/funchook/distorm/examples/java/jdistorm.vcproj +208 -0
- data/funchook/distorm/examples/linux/Makefile +15 -0
- data/funchook/distorm/examples/linux/main.c +181 -0
- data/funchook/distorm/examples/tests/Makefile +15 -0
- data/funchook/distorm/examples/tests/main.cpp +42 -0
- data/funchook/distorm/examples/tests/main.py +66 -0
- data/funchook/distorm/examples/tests/test_distorm3.py +1672 -0
- data/funchook/distorm/examples/tests/tests.sln +20 -0
- data/funchook/distorm/examples/tests/tests.vcxproj +82 -0
- data/funchook/distorm/examples/tests/tests.vcxproj.filters +22 -0
- data/funchook/distorm/examples/win32/disasm.sln +25 -0
- data/funchook/distorm/examples/win32/disasm.vcxproj +201 -0
- data/funchook/distorm/examples/win32/disasm.vcxproj.filters +14 -0
- data/funchook/distorm/examples/win32/main.cpp +163 -0
- data/funchook/distorm/include/distorm.h +482 -0
- data/funchook/distorm/include/mnemonics.h +301 -0
- data/funchook/distorm/make/linux/Makefile +28 -0
- data/funchook/distorm/make/mac/Makefile +24 -0
- data/funchook/distorm/make/win32/cdistorm.vcxproj +239 -0
- data/funchook/distorm/make/win32/cdistorm.vcxproj.filters +80 -0
- data/funchook/distorm/make/win32/distorm.sln +25 -0
- data/funchook/distorm/make/win32/resource.h +14 -0
- data/funchook/distorm/make/win32/resource.rc +99 -0
- data/funchook/distorm/python/distorm3/__init__.py +957 -0
- data/funchook/distorm/python/distorm3/sample.py +51 -0
- data/funchook/distorm/setup.cfg +10 -0
- data/funchook/distorm/setup.py +266 -0
- data/funchook/distorm/src/config.h +169 -0
- data/funchook/distorm/src/decoder.c +641 -0
- data/funchook/distorm/src/decoder.h +33 -0
- data/funchook/distorm/src/distorm.c +413 -0
- data/funchook/distorm/src/instructions.c +597 -0
- data/funchook/distorm/src/instructions.h +463 -0
- data/funchook/distorm/src/insts.c +7939 -0
- data/funchook/distorm/src/insts.h +64 -0
- data/funchook/distorm/src/mnemonics.c +284 -0
- data/funchook/distorm/src/operands.c +1290 -0
- data/funchook/distorm/src/operands.h +28 -0
- data/funchook/distorm/src/prefix.c +368 -0
- data/funchook/distorm/src/prefix.h +64 -0
- data/funchook/distorm/src/textdefs.c +172 -0
- data/funchook/distorm/src/textdefs.h +57 -0
- data/funchook/distorm/src/wstring.c +47 -0
- data/funchook/distorm/src/wstring.h +35 -0
- data/funchook/distorm/src/x86defs.h +82 -0
- data/funchook/include/funchook.h +123 -0
- data/funchook/install-sh +527 -0
- data/funchook/src/Makefile +70 -0
- data/funchook/src/Makefile.in +70 -0
- data/funchook/src/__strerror.h +109 -0
- data/funchook/src/config.h +101 -0
- data/funchook/src/config.h.in +100 -0
- data/funchook/src/decoder.o +0 -0
- data/funchook/src/distorm.o +0 -0
- data/funchook/src/funchook.c +440 -0
- data/funchook/src/funchook.o +0 -0
- data/funchook/src/funchook_internal.h +155 -0
- data/funchook/src/funchook_io.c +182 -0
- data/funchook/src/funchook_io.h +64 -0
- data/funchook/src/funchook_io.o +0 -0
- data/funchook/src/funchook_syscall.S +134 -0
- data/funchook/src/funchook_syscall.o +0 -0
- data/funchook/src/funchook_unix.c +480 -0
- data/funchook/src/funchook_unix.o +0 -0
- data/funchook/src/funchook_windows.c +397 -0
- data/funchook/src/funchook_x86.c +622 -0
- data/funchook/src/funchook_x86.o +0 -0
- data/funchook/src/instructions.o +0 -0
- data/funchook/src/insts.o +0 -0
- data/funchook/src/libfunchook.so +0 -0
- data/funchook/src/mnemonics.o +0 -0
- data/funchook/src/operands.o +0 -0
- data/funchook/src/os_func.c +115 -0
- data/funchook/src/os_func.h +75 -0
- data/funchook/src/os_func.o +0 -0
- data/funchook/src/os_func_unix.c +94 -0
- data/funchook/src/os_func_unix.o +0 -0
- data/funchook/src/os_func_windows.c +32 -0
- data/funchook/src/prefix.o +0 -0
- data/funchook/src/printf_base.c +1688 -0
- data/funchook/src/printf_base.h +46 -0
- data/funchook/src/printf_base.o +0 -0
- data/funchook/src/textdefs.o +0 -0
- data/funchook/src/wstring.o +0 -0
- data/funchook/test/Makefile +43 -0
- data/funchook/test/Makefile.in +43 -0
- data/funchook/test/funchook_test +0 -0
- data/funchook/test/libfunchook_test.c +25 -0
- data/funchook/test/libfunchook_test.so +0 -0
- data/funchook/test/libfunchook_test2.c +18 -0
- data/funchook/test/suffix.list +600 -0
- data/funchook/test/test_main.c +430 -0
- data/funchook/test/test_main.o +0 -0
- data/funchook/test/x86_64_test.S +10 -0
- data/funchook/test/x86_64_test.o +0 -0
- data/funchook/test/x86_test.S +339 -0
- data/funchook/win32/config.h +1 -0
- data/funchook/win32/funchook.sln +52 -0
- data/funchook/win32/funchook.vcxproj +188 -0
- data/funchook/win32/funchook.vcxproj.filters +84 -0
- data/funchook/win32/funchook_test.vcxproj +170 -0
- data/funchook/win32/funchook_test.vcxproj.filters +22 -0
- data/funchook/win32/funchook_test_dll.vcxproj +184 -0
- data/funchook/win32/funchook_test_dll.vcxproj.filters +30 -0
- data/funchook/win32/funchook_test_exe.def +3 -0
- data/lib/contrast-agent.rb +8 -0
- data/lib/contrast.rb +57 -0
- data/lib/contrast/agent.rb +80 -0
- data/lib/contrast/agent/assess.rb +45 -0
- data/lib/contrast/agent/assess/adjusted_span.rb +25 -0
- data/lib/contrast/agent/assess/class_reverter.rb +82 -0
- data/lib/contrast/agent/assess/contrast_event.rb +398 -0
- data/lib/contrast/agent/assess/frozen_properties.rb +41 -0
- data/lib/contrast/agent/assess/insulator.rb +53 -0
- data/lib/contrast/agent/assess/policy/dynamic_source_factory.rb +78 -0
- data/lib/contrast/agent/assess/policy/patcher.rb +85 -0
- data/lib/contrast/agent/assess/policy/policy.rb +116 -0
- data/lib/contrast/agent/assess/policy/policy_node.rb +289 -0
- data/lib/contrast/agent/assess/policy/policy_scanner.rb +44 -0
- data/lib/contrast/agent/assess/policy/preshift.rb +94 -0
- data/lib/contrast/agent/assess/policy/propagation_method.rb +260 -0
- data/lib/contrast/agent/assess/policy/propagation_node.rb +127 -0
- data/lib/contrast/agent/assess/policy/propagator.rb +35 -0
- data/lib/contrast/agent/assess/policy/propagator/append.rb +54 -0
- data/lib/contrast/agent/assess/policy/propagator/base.rb +37 -0
- data/lib/contrast/agent/assess/policy/propagator/center.rb +73 -0
- data/lib/contrast/agent/assess/policy/propagator/custom.rb +36 -0
- data/lib/contrast/agent/assess/policy/propagator/database_write.rb +62 -0
- data/lib/contrast/agent/assess/policy/propagator/insert.rb +55 -0
- data/lib/contrast/agent/assess/policy/propagator/keep.rb +26 -0
- data/lib/contrast/agent/assess/policy/propagator/next.rb +42 -0
- data/lib/contrast/agent/assess/policy/propagator/prepend.rb +50 -0
- data/lib/contrast/agent/assess/policy/propagator/remove.rb +76 -0
- data/lib/contrast/agent/assess/policy/propagator/replace.rb +27 -0
- data/lib/contrast/agent/assess/policy/propagator/reverse.rb +38 -0
- data/lib/contrast/agent/assess/policy/propagator/select.rb +86 -0
- data/lib/contrast/agent/assess/policy/propagator/splat.rb +60 -0
- data/lib/contrast/agent/assess/policy/propagator/split.rb +49 -0
- data/lib/contrast/agent/assess/policy/propagator/substitution.rb +169 -0
- data/lib/contrast/agent/assess/policy/propagator/trim.rb +81 -0
- data/lib/contrast/agent/assess/policy/rewriter_patch.rb +79 -0
- data/lib/contrast/agent/assess/policy/source_method.rb +209 -0
- data/lib/contrast/agent/assess/policy/source_node.rb +62 -0
- data/lib/contrast/agent/assess/policy/trigger_method.rb +209 -0
- data/lib/contrast/agent/assess/policy/trigger_node.rb +198 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/ssrf_validator.rb +77 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/trigger_validation.rb +31 -0
- data/lib/contrast/agent/assess/policy/trigger_validation/xss_validator.rb +40 -0
- data/lib/contrast/agent/assess/properties.rb +392 -0
- data/lib/contrast/agent/assess/rule.rb +18 -0
- data/lib/contrast/agent/assess/rule/base.rb +72 -0
- data/lib/contrast/agent/assess/rule/csrf.rb +66 -0
- data/lib/contrast/agent/assess/rule/csrf/csrf_action.rb +28 -0
- data/lib/contrast/agent/assess/rule/csrf/csrf_applicator.rb +69 -0
- data/lib/contrast/agent/assess/rule/csrf/csrf_watcher.rb +132 -0
- data/lib/contrast/agent/assess/rule/provider.rb +21 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_key.rb +62 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_password.rb +73 -0
- data/lib/contrast/agent/assess/rule/provider/hardcoded_value_rule.rb +121 -0
- data/lib/contrast/agent/assess/rule/redos.rb +68 -0
- data/lib/contrast/agent/assess/rule/response_scanning_rule.rb +47 -0
- data/lib/contrast/agent/assess/rule/response_watcher.rb +36 -0
- data/lib/contrast/agent/assess/rule/watcher.rb +36 -0
- data/lib/contrast/agent/assess/tag.rb +151 -0
- data/lib/contrast/agent/at_exit_hook.rb +33 -0
- data/lib/contrast/agent/class_reopener.rb +195 -0
- data/lib/contrast/agent/deadzone/policy/deadzone_node.rb +26 -0
- data/lib/contrast/agent/deadzone/policy/policy.rb +57 -0
- data/lib/contrast/agent/disable_reaction.rb +24 -0
- data/lib/contrast/agent/exclusion_matcher.rb +190 -0
- data/lib/contrast/agent/feature_state.rb +379 -0
- data/lib/contrast/agent/inventory/policy/policy.rb +32 -0
- data/lib/contrast/agent/inventory/policy/trigger_node.rb +22 -0
- data/lib/contrast/agent/logger_manager.rb +116 -0
- data/lib/contrast/agent/middleware.rb +352 -0
- data/lib/contrast/agent/module_data.rb +16 -0
- data/lib/contrast/agent/patching/policy/after_load_patch.rb +37 -0
- data/lib/contrast/agent/patching/policy/after_load_patcher.rb +58 -0
- data/lib/contrast/agent/patching/policy/method_policy.rb +94 -0
- data/lib/contrast/agent/patching/policy/module_policy.rb +116 -0
- data/lib/contrast/agent/patching/policy/patch.rb +312 -0
- data/lib/contrast/agent/patching/policy/patch_status.rb +192 -0
- data/lib/contrast/agent/patching/policy/patcher.rb +310 -0
- data/lib/contrast/agent/patching/policy/policy.rb +138 -0
- data/lib/contrast/agent/patching/policy/policy_node.rb +80 -0
- data/lib/contrast/agent/patching/policy/policy_unpatcher.rb +28 -0
- data/lib/contrast/agent/patching/policy/trigger_node.rb +81 -0
- data/lib/contrast/agent/protect/policy/policy.rb +37 -0
- data/lib/contrast/agent/protect/policy/trigger_node.rb +23 -0
- data/lib/contrast/agent/protect/rule.rb +58 -0
- data/lib/contrast/agent/protect/rule/base.rb +300 -0
- data/lib/contrast/agent/protect/rule/base_service.rb +88 -0
- data/lib/contrast/agent/protect/rule/cmd_injection.rb +156 -0
- data/lib/contrast/agent/protect/rule/csrf.rb +118 -0
- data/lib/contrast/agent/protect/rule/csrf/csrf_evaluator.rb +103 -0
- data/lib/contrast/agent/protect/rule/csrf/csrf_token_injector.rb +85 -0
- data/lib/contrast/agent/protect/rule/default_scanner.rb +300 -0
- data/lib/contrast/agent/protect/rule/deserialization.rb +193 -0
- data/lib/contrast/agent/protect/rule/http_method_tampering.rb +80 -0
- data/lib/contrast/agent/protect/rule/no_sqli.rb +101 -0
- data/lib/contrast/agent/protect/rule/no_sqli/mongo_no_sql_scanner.rb +40 -0
- data/lib/contrast/agent/protect/rule/path_traversal.rb +143 -0
- data/lib/contrast/agent/protect/rule/sqli.rb +101 -0
- data/lib/contrast/agent/protect/rule/sqli/default_sql_scanner.rb +16 -0
- data/lib/contrast/agent/protect/rule/sqli/mysql_sql_scanner.rb +38 -0
- data/lib/contrast/agent/protect/rule/sqli/postgres_sql_scanner.rb +22 -0
- data/lib/contrast/agent/protect/rule/sqli/sqlite_sql_scanner.rb +19 -0
- data/lib/contrast/agent/protect/rule/unsafe_file_upload.rb +20 -0
- data/lib/contrast/agent/protect/rule/xss.rb +24 -0
- data/lib/contrast/agent/protect/rule/xxe.rb +120 -0
- data/lib/contrast/agent/protect/rule/xxe/entity_wrapper.rb +82 -0
- data/lib/contrast/agent/railtie.rb +30 -0
- data/lib/contrast/agent/reaction_processor.rb +47 -0
- data/lib/contrast/agent/request.rb +493 -0
- data/lib/contrast/agent/request_context.rb +225 -0
- data/lib/contrast/agent/require_state.rb +61 -0
- data/lib/contrast/agent/response.rb +215 -0
- data/lib/contrast/agent/rewriter.rb +244 -0
- data/lib/contrast/agent/scope.rb +28 -0
- data/lib/contrast/agent/service_heartbeat.rb +37 -0
- data/lib/contrast/agent/settings_state.rb +148 -0
- data/lib/contrast/agent/socket_client.rb +125 -0
- data/lib/contrast/agent/thread.rb +26 -0
- data/lib/contrast/agent/tracepoint_hook.rb +51 -0
- data/lib/contrast/agent/version.rb +8 -0
- data/lib/contrast/api.rb +17 -0
- data/lib/contrast/api/.gitkeep +0 -0
- data/lib/contrast/api/connection_status.rb +49 -0
- data/lib/contrast/api/socket.rb +43 -0
- data/lib/contrast/api/speedracer.rb +206 -0
- data/lib/contrast/api/tcp_socket.rb +31 -0
- data/lib/contrast/api/unix_socket.rb +25 -0
- data/lib/contrast/common_agent_configuration.rb +86 -0
- data/lib/contrast/components/agent.rb +85 -0
- data/lib/contrast/components/app_context.rb +188 -0
- data/lib/contrast/components/assess.rb +67 -0
- data/lib/contrast/components/config.rb +135 -0
- data/lib/contrast/components/contrast_service.rb +113 -0
- data/lib/contrast/components/heap_dump.rb +34 -0
- data/lib/contrast/components/interface.rb +178 -0
- data/lib/contrast/components/inventory.rb +23 -0
- data/lib/contrast/components/logger.rb +92 -0
- data/lib/contrast/components/protect.rb +38 -0
- data/lib/contrast/components/sampling.rb +41 -0
- data/lib/contrast/components/scope.rb +106 -0
- data/lib/contrast/components/settings.rb +140 -0
- data/lib/contrast/config.rb +33 -0
- data/lib/contrast/config/agent_configuration.rb +24 -0
- data/lib/contrast/config/application_configuration.rb +27 -0
- data/lib/contrast/config/assess_configuration.rb +22 -0
- data/lib/contrast/config/assess_rules_configuration.rb +18 -0
- data/lib/contrast/config/base_configuration.rb +105 -0
- data/lib/contrast/config/default_value.rb +16 -0
- data/lib/contrast/config/exception_configuration.rb +21 -0
- data/lib/contrast/config/heap_dump_configuration.rb +23 -0
- data/lib/contrast/config/inventory_configuration.rb +20 -0
- data/lib/contrast/config/logger_configuration.rb +20 -0
- data/lib/contrast/config/protect_configuration.rb +20 -0
- data/lib/contrast/config/protect_rule_configuration.rb +37 -0
- data/lib/contrast/config/protect_rules_configuration.rb +30 -0
- data/lib/contrast/config/root_configuration.rb +26 -0
- data/lib/contrast/config/ruby_configuration.rb +39 -0
- data/lib/contrast/config/sampling_configuration.rb +22 -0
- data/lib/contrast/config/server_configuration.rb +23 -0
- data/lib/contrast/config/service_configuration.rb +22 -0
- data/lib/contrast/configuration.rb +214 -0
- data/lib/contrast/core_extensions/assess.rb +51 -0
- data/lib/contrast/core_extensions/assess/array.rb +58 -0
- data/lib/contrast/core_extensions/assess/assess_extension.rb +145 -0
- data/lib/contrast/core_extensions/assess/basic_object.rb +15 -0
- data/lib/contrast/core_extensions/assess/erb.rb +42 -0
- data/lib/contrast/core_extensions/assess/exec_trigger.rb +48 -0
- data/lib/contrast/core_extensions/assess/fiber.rb +125 -0
- data/lib/contrast/core_extensions/assess/hash.rb +22 -0
- data/lib/contrast/core_extensions/assess/kernel.rb +95 -0
- data/lib/contrast/core_extensions/assess/module.rb +14 -0
- data/lib/contrast/core_extensions/assess/regexp.rb +206 -0
- data/lib/contrast/core_extensions/assess/string.rb +75 -0
- data/lib/contrast/core_extensions/assess/tilt_template_trigger.rb +73 -0
- data/lib/contrast/core_extensions/delegator.rb +14 -0
- data/lib/contrast/core_extensions/eval_trigger.rb +52 -0
- data/lib/contrast/core_extensions/inventory.rb +22 -0
- data/lib/contrast/core_extensions/inventory/datastores.rb +37 -0
- data/lib/contrast/core_extensions/module.rb +42 -0
- data/lib/contrast/core_extensions/object.rb +27 -0
- data/lib/contrast/core_extensions/protect.rb +20 -0
- data/lib/contrast/core_extensions/protect/applies_command_injection_rule.rb +70 -0
- data/lib/contrast/core_extensions/protect/applies_deserialization_rule.rb +58 -0
- data/lib/contrast/core_extensions/protect/applies_no_sqli_rule.rb +81 -0
- data/lib/contrast/core_extensions/protect/applies_path_traversal_rule.rb +119 -0
- data/lib/contrast/core_extensions/protect/applies_sqli_rule.rb +63 -0
- data/lib/contrast/core_extensions/protect/applies_xxe_rule.rb +141 -0
- data/lib/contrast/core_extensions/protect/kernel.rb +30 -0
- data/lib/contrast/core_extensions/protect/psych.rb +7 -0
- data/lib/contrast/core_extensions/thread.rb +31 -0
- data/lib/contrast/internal_exception.rb +8 -0
- data/lib/contrast/rails_extensions/assess/action_controller_inheritance.rb +48 -0
- data/lib/contrast/rails_extensions/assess/active_record.rb +32 -0
- data/lib/contrast/rails_extensions/assess/active_record_named.rb +61 -0
- data/lib/contrast/rails_extensions/assess/configuration.rb +26 -0
- data/lib/contrast/rails_extensions/buffer.rb +30 -0
- data/lib/contrast/rails_extensions/rack.rb +45 -0
- data/lib/contrast/security_exception.rb +14 -0
- data/lib/contrast/sinatra_extensions/assess/cookie.rb +26 -0
- data/lib/contrast/sinatra_extensions/inventory/sinatra_base.rb +59 -0
- data/lib/contrast/tasks/service.rb +95 -0
- data/lib/contrast/utils/assess/sampling_util.rb +96 -0
- data/lib/contrast/utils/assess/tracking_util.rb +39 -0
- data/lib/contrast/utils/boolean_util.rb +33 -0
- data/lib/contrast/utils/cache.rb +69 -0
- data/lib/contrast/utils/class_util.rb +58 -0
- data/lib/contrast/utils/comment_range.rb +19 -0
- data/lib/contrast/utils/data_store_util.rb +23 -0
- data/lib/contrast/utils/duck_utils.rb +58 -0
- data/lib/contrast/utils/env_configuration_item.rb +52 -0
- data/lib/contrast/utils/environment_util.rb +152 -0
- data/lib/contrast/utils/freeze_util.rb +36 -0
- data/lib/contrast/utils/gemfile_reader.rb +191 -0
- data/lib/contrast/utils/hash_digest.rb +148 -0
- data/lib/contrast/utils/heap_dump_util.rb +113 -0
- data/lib/contrast/utils/invalid_configuration_util.rb +88 -0
- data/lib/contrast/utils/inventory_util.rb +126 -0
- data/lib/contrast/utils/io_util.rb +61 -0
- data/lib/contrast/utils/object_share.rb +117 -0
- data/lib/contrast/utils/operating_environment.rb +38 -0
- data/lib/contrast/utils/os.rb +49 -0
- data/lib/contrast/utils/path_util.rb +151 -0
- data/lib/contrast/utils/performs_logging.rb +152 -0
- data/lib/contrast/utils/preflight_util.rb +13 -0
- data/lib/contrast/utils/prevent_serialization.rb +52 -0
- data/lib/contrast/utils/rack_assess_session_cookie.rb +104 -0
- data/lib/contrast/utils/rails_assess_configuration.rb +95 -0
- data/lib/contrast/utils/random_util.rb +22 -0
- data/lib/contrast/utils/resource_loader.rb +23 -0
- data/lib/contrast/utils/ruby_ast_rewriter.rb +74 -0
- data/lib/contrast/utils/scope_util.rb +99 -0
- data/lib/contrast/utils/service_response_util.rb +116 -0
- data/lib/contrast/utils/service_sender_util.rb +98 -0
- data/lib/contrast/utils/sha256_builder.rb +69 -0
- data/lib/contrast/utils/sinatra_helper.rb +49 -0
- data/lib/contrast/utils/stack_trace_utils.rb +209 -0
- data/lib/contrast/utils/string_utils.rb +72 -0
- data/lib/contrast/utils/tag_util.rb +139 -0
- data/lib/contrast/utils/thread_tracker.rb +54 -0
- data/lib/contrast/utils/timer.rb +78 -0
- data/resources/assess/policy.json +1673 -0
- data/resources/csrf/inject.js +44 -0
- data/resources/deadzone/policy.json +55 -0
- data/resources/factory-bot-spec/spec_helper.rb +30 -0
- data/resources/inventory/policy.json +110 -0
- data/resources/protect/policy.json +417 -0
- data/resources/rubocops/kernel/catch_cop.rb +37 -0
- data/resources/rubocops/kernel/require_cop.rb +37 -0
- data/resources/rubocops/kernel/require_relative_cop.rb +33 -0
- data/resources/rubocops/module/autoload_cop.rb +37 -0
- data/resources/rubocops/module/const_defined_cop.rb +37 -0
- data/resources/rubocops/module/const_get_cop.rb +37 -0
- data/resources/rubocops/module/const_set_cop.rb +37 -0
- data/resources/rubocops/module/constants_cop.rb +37 -0
- data/resources/rubocops/module/name_cop.rb +37 -0
- data/resources/rubocops/object/class_cop.rb +37 -0
- data/resources/rubocops/object/freeze_cop.rb +37 -0
- data/resources/rubocops/object/frozen_cop.rb +37 -0
- data/resources/rubocops/object/is_a_cop.rb +37 -0
- data/resources/rubocops/object/method_cop.rb +37 -0
- data/resources/rubocops/object/respond_to_cop.rb +37 -0
- data/resources/rubocops/object/singleton_class_cop.rb +37 -0
- data/resources/rubocops/regexp/spelling_cop.rb +44 -0
- data/resources/rubocops/thread/new_cop.rb +39 -0
- data/resources/ruby-spec/ancestors_spec.rb +70 -0
- data/resources/ruby-spec/modulo_spec.rb +831 -0
- data/resources/ruby-spec/parameters_spec.rb +261 -0
- data/resources/ruby-spec/ruby_spec_spec_helper.rb +35 -0
- data/resources/test_marker.txt +1 -0
- data/ruby-agent.gemspec +129 -0
- data/service_executables/.gitkeep +0 -0
- data/service_executables/VERSION +1 -0
- data/service_executables/linux/contrast-service +0 -0
- data/service_executables/mac/contrast-service +0 -0
- metadata +945 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Contrast
|
|
5
|
+
module Components
|
|
6
|
+
module Inventory
|
|
7
|
+
# A wrapper build around the Common Agent Configuration project to allow
|
|
8
|
+
# for access of the values contained in its
|
|
9
|
+
# parent_configuration_spec.yaml.
|
|
10
|
+
# Specifically, this allows for querying the state of the Inventory
|
|
11
|
+
# product.
|
|
12
|
+
class Interface
|
|
13
|
+
include Contrast::Components::ComponentBase
|
|
14
|
+
|
|
15
|
+
def enabled?
|
|
16
|
+
state.inventory_enabled?
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
COMPONENT_INTERFACE = Interface.new
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Contrast
|
|
5
|
+
module Components
|
|
6
|
+
module Logger
|
|
7
|
+
module InstanceMethods #:nodoc:
|
|
8
|
+
def logger
|
|
9
|
+
Contrast::Components::Logger::COMPONENT_INTERFACE
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
ClassMethods = InstanceMethods
|
|
13
|
+
|
|
14
|
+
# A wrapper build around the Common Agent Configuration project to allow
|
|
15
|
+
# for access of the values contained in its
|
|
16
|
+
# parent_configuration_spec.yaml.
|
|
17
|
+
# Specifically, this allows for querying the state of the Agent Logger.
|
|
18
|
+
class Interface
|
|
19
|
+
include Contrast::Components::ComponentBase
|
|
20
|
+
|
|
21
|
+
%w[error? warn? info? debug?].each do |level|
|
|
22
|
+
define_method(level) { state.logger.send(level) }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# def trace? # TODO: RUBY-547
|
|
26
|
+
# config&.agent&.logger&.level && config.agent.logger.level.to_s.casecmp('TRACE').to_i.zero?
|
|
27
|
+
# end
|
|
28
|
+
|
|
29
|
+
def error *args
|
|
30
|
+
log_with_level(*args, :error)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def warn *args
|
|
34
|
+
log_with_level(*args, :warn)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def info *args
|
|
38
|
+
log_with_level(*args, :info)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def debug *args
|
|
42
|
+
log_with_level(*args, :debug)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def with_level *args
|
|
46
|
+
log_with_level(*args)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def debug_with_time msg
|
|
50
|
+
ret = nil
|
|
51
|
+
a = Contrast::Utils::Timer.now_ms
|
|
52
|
+
ret = yield if block_given?
|
|
53
|
+
z = Contrast::Utils::Timer.now_ms
|
|
54
|
+
log_with_level(nil, "#{ msg }: pid=#{ Process.pid }, elapsed=#{ z - a }ms", :debug)
|
|
55
|
+
ret
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# def trace_with_time msg # TODO: RUBY-547
|
|
59
|
+
# ret = nil
|
|
60
|
+
# unless trace?
|
|
61
|
+
# ret = yield if block_given?
|
|
62
|
+
# return ret
|
|
63
|
+
# end
|
|
64
|
+
#
|
|
65
|
+
# a = Contrast::Utils::Timer.now_ms
|
|
66
|
+
# ret = yield if block_given?
|
|
67
|
+
# z = Contrast::Utils::Timer.now_ms
|
|
68
|
+
# log_with_level(nil, "#{ msg }: pid=#{ Process.pid }, elapsed=#{ z - a }ms", :debug)
|
|
69
|
+
# ret
|
|
70
|
+
# end
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def log_with_level *args
|
|
75
|
+
if args.length == 2
|
|
76
|
+
msg, level = *args
|
|
77
|
+
state.cs__class.log_with_level(nil, msg, level)
|
|
78
|
+
elsif args.length == 3
|
|
79
|
+
exception, msg, level = *args
|
|
80
|
+
state.cs__class.log_with_level(exception, msg, level)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
nil
|
|
84
|
+
rescue StandardError
|
|
85
|
+
nil
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
COMPONENT_INTERFACE = Interface.new
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Contrast
|
|
5
|
+
module Components
|
|
6
|
+
module Protect
|
|
7
|
+
# A wrapper build around the Common Agent Configuration project to allow
|
|
8
|
+
# for access of the values contained in its
|
|
9
|
+
# parent_configuration_spec.yaml.
|
|
10
|
+
# Specifically, this allows for querying the state of the Protect
|
|
11
|
+
# product.
|
|
12
|
+
class Interface
|
|
13
|
+
include Contrast::Components::ComponentBase
|
|
14
|
+
include Contrast::Components::Interface
|
|
15
|
+
|
|
16
|
+
access_component :settings
|
|
17
|
+
|
|
18
|
+
def enabled?
|
|
19
|
+
state.protect_enabled?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def forcibly_disabled?
|
|
23
|
+
state.protect_forcibly_disabled?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def rules
|
|
27
|
+
SETTINGS.protect_rules
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def rule name
|
|
31
|
+
SETTINGS.protect_rules[name]
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
COMPONENT_INTERFACE = Interface.new
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Contrast
|
|
5
|
+
module Components
|
|
6
|
+
module Sampling
|
|
7
|
+
module Constants
|
|
8
|
+
DEFAULT_SAMPLING_ENABLED = false
|
|
9
|
+
DEFAULT_SAMPLING_BASELINE = 5
|
|
10
|
+
DEFAULT_SAMPLING_REQUEST_FREQUENCY = 5
|
|
11
|
+
DEFAULT_SAMPLING_RESPONSE_FREQUENCY = 25
|
|
12
|
+
DEFAULT_SAMPLING_WINDOW_MS = 180_000 # 3 minutes, arbitrary value from Java agent
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
module ClassMethods #:nodoc:
|
|
16
|
+
include Contrast::Components::ComponentBase
|
|
17
|
+
include Constants
|
|
18
|
+
include Contrast::Components::Interface
|
|
19
|
+
|
|
20
|
+
access_component :config
|
|
21
|
+
|
|
22
|
+
def sampling_control settings = @sampling_features
|
|
23
|
+
cas = CONFIG.root.assess&.sampling
|
|
24
|
+
|
|
25
|
+
{
|
|
26
|
+
enabled: [cas&.enable, settings&.enabled, DEFAULT_SAMPLING_ENABLED] .reject(&:nil?).first,
|
|
27
|
+
baseline: [cas&.baseline, settings&.baseline, DEFAULT_SAMPLING_BASELINE] .map(&:to_i).find(&:positive?),
|
|
28
|
+
request_frequency: [cas&.request_frequency, settings&.request_frequency, DEFAULT_SAMPLING_REQUEST_FREQUENCY] .map(&:to_i).find(&:positive?),
|
|
29
|
+
response_frequency: [cas&.response_frequency, settings&.response_frequency, DEFAULT_SAMPLING_RESPONSE_FREQUENCY].map(&:to_i).find(&:positive?),
|
|
30
|
+
window: [cas&.window_ms, settings&.window_ms, DEFAULT_SAMPLING_WINDOW_MS] .map(&:to_i).find(&:positive?)
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
module InstanceMethods #:nodoc:
|
|
36
|
+
include Contrast::Components::ComponentBase
|
|
37
|
+
include Constants
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
cs__scoped_require 'monitor'
|
|
5
|
+
cs__scoped_require 'fiber'
|
|
6
|
+
cs__scoped_require 'contrast/agent/scope'
|
|
7
|
+
|
|
8
|
+
# This is the Scope component.
|
|
9
|
+
#
|
|
10
|
+
# It tracks /Contrast/ scope. That is, "are we currently doing assess
|
|
11
|
+
# or protect stuff within a patched method?" -- this is how we avoid doing
|
|
12
|
+
# Contrast stuff on Contrast code.
|
|
13
|
+
#
|
|
14
|
+
# Separately from this component, there is also require scope, which is an
|
|
15
|
+
# optimization on how we implement patching to `require`.
|
|
16
|
+
module Contrast
|
|
17
|
+
module Components
|
|
18
|
+
module Scope # :nodoc:
|
|
19
|
+
MONITOR = Monitor.new
|
|
20
|
+
EXECUTION_CONTEXT = {} # rubocop:disable Style/MutableConstant
|
|
21
|
+
|
|
22
|
+
class Interface # :nodoc:
|
|
23
|
+
include Contrast::Components::ComponentBase
|
|
24
|
+
|
|
25
|
+
def initialize
|
|
26
|
+
# This is probably redundant with #scope_for_current_ec's nil check.
|
|
27
|
+
EXECUTION_CONTEXT[Fiber.current] = Contrast::Agent::Scope.new
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# This returns the scope governing the current execution context.
|
|
31
|
+
# Use this sparingly, preferring the instance & class methods to
|
|
32
|
+
# access and query scope, rather than interacting with the scope
|
|
33
|
+
# object directly.
|
|
34
|
+
def scope_for_current_ec
|
|
35
|
+
MONITOR.synchronize do
|
|
36
|
+
return EXECUTION_CONTEXT[Fiber.current] ||= Contrast::Agent::Scope.new
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
module InstanceMethods # :nodoc:
|
|
42
|
+
# These scopes can be meta-defined (RUBY-573)
|
|
43
|
+
#
|
|
44
|
+
# [:my_cool_scope, :another_good_one].each do |scope|
|
|
45
|
+
# define_method "in_#{scope}_scope?" do
|
|
46
|
+
# abc
|
|
47
|
+
# end
|
|
48
|
+
# end
|
|
49
|
+
|
|
50
|
+
def in_contrast_scope?
|
|
51
|
+
scope_for_current_ec.in_contrast_scope?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def enter_contrast_scope!
|
|
55
|
+
scope_for_current_ec.enter_scope_for Contrast::Agent::Scope::CONTRAST_SCOPE
|
|
56
|
+
scope_for_current_ec
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def exit_contrast_scope!
|
|
60
|
+
scope_for_current_ec.exit_scope_for Contrast::Agent::Scope::CONTRAST_SCOPE
|
|
61
|
+
scope_for_current_ec
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def with_contrast_scope
|
|
65
|
+
enter_contrast_scope!
|
|
66
|
+
yield
|
|
67
|
+
ensure
|
|
68
|
+
exit_contrast_scope!
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def scope_for_current_ec
|
|
72
|
+
MONITOR.synchronize do
|
|
73
|
+
return EXECUTION_CONTEXT[Fiber.current] ||= Contrast::Agent::Scope.new
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# TODO: https://contrast.atlassian.net/browse/RUBY-290
|
|
78
|
+
#
|
|
79
|
+
# Current behavior is to no-op if we're not "in a request context".
|
|
80
|
+
# Our C functions were previously checking to see if we had a scope, because
|
|
81
|
+
# scope was tacked on to a request context -- so "we have a scope, therefore,
|
|
82
|
+
# we have a request context." We've decoupled scopes from request contexts,
|
|
83
|
+
# so now it checks "do we have a request context."
|
|
84
|
+
# RUBY-290 should remove all of that, including this method.
|
|
85
|
+
def in_request_context?
|
|
86
|
+
!!Contrast::Agent::REQUEST_TRACKER.current
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def self.sweep_dead_ecs
|
|
91
|
+
# TODO: RUBY-571, #sweep_dead_ecs compensates for a lack of weak tables
|
|
92
|
+
# 'ec' for execution context. in this case, it's a Fiber.
|
|
93
|
+
# Threads rely on Fibers, so two birds, one stone.
|
|
94
|
+
MONITOR.synchronize do
|
|
95
|
+
EXECUTION_CONTEXT.delete_if do |ec, _scope|
|
|
96
|
+
!ec.alive?
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
ClassMethods = InstanceMethods
|
|
102
|
+
|
|
103
|
+
COMPONENT_INTERFACE = Interface.new
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Contrast
|
|
5
|
+
module Components
|
|
6
|
+
# This component encapsulates the statefulness of settings.
|
|
7
|
+
# When we say 'settings', we're referring specifically to external
|
|
8
|
+
# directives (likely provided by TeamServer) about product operation.
|
|
9
|
+
# 'Settings' is not a generic term for 'configurable stuff'.
|
|
10
|
+
module Settings
|
|
11
|
+
# This is a class.
|
|
12
|
+
class Interface
|
|
13
|
+
include Contrast::Components::ComponentBase
|
|
14
|
+
include Contrast::Components::Interface
|
|
15
|
+
access_component :config
|
|
16
|
+
|
|
17
|
+
attr_reader :assess_rules,
|
|
18
|
+
:protect_rules
|
|
19
|
+
|
|
20
|
+
# Other stateful information that doesn't yet cleanly fit anywhere:
|
|
21
|
+
|
|
22
|
+
# tainted_columns are database columns that receive unsanitized input.
|
|
23
|
+
# this statefulness
|
|
24
|
+
attr_reader :tainted_columns # This can probably go into assess_state?
|
|
25
|
+
|
|
26
|
+
# a vulnerability like padding oracle is exploited across
|
|
27
|
+
# multiple requests, as a timing attack. these attempts must be
|
|
28
|
+
# accumulated, in order to recognize the pattern and block the attack.
|
|
29
|
+
attr_reader :accumulator_settings
|
|
30
|
+
|
|
31
|
+
# These three 'state' variables represent atomic config/setting state,
|
|
32
|
+
# outside of things like rule defs.
|
|
33
|
+
|
|
34
|
+
def assess_state
|
|
35
|
+
@assess_state ||= { # rubocop:disable Naming/MemoizedInstanceVariableName
|
|
36
|
+
enabled: false,
|
|
37
|
+
sampling_features: nil
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def protect_state
|
|
42
|
+
@protect_state ||= { # rubocop:disable Naming/MemoizedInstanceVariableName
|
|
43
|
+
enabled: false,
|
|
44
|
+
accumulator_settings: Contrast::Api::Settings::AccumulatorSettings.new
|
|
45
|
+
}
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def application_state
|
|
49
|
+
@application_state ||= { # rubocop:disable Naming/MemoizedInstanceVariableName
|
|
50
|
+
modes_by_id: Hash.new(:NO_ACTION),
|
|
51
|
+
exclusion_matchers: [],
|
|
52
|
+
disabled_assess_rules: []
|
|
53
|
+
}
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# These are settings that we receive & store.
|
|
57
|
+
# Rules are settings too, but they're more involved.
|
|
58
|
+
# So, between this block and rules, that's setting state.
|
|
59
|
+
PROTECT_STATE_ATTRS = %i[].cs__freeze
|
|
60
|
+
ASSESS_STATE_ATTRS = %i[sampling_features].cs__freeze
|
|
61
|
+
APPLICATION_STATE_ATTRS = %i[modes_by_id exclusion_matchers disabled_assess_rules session_id].cs__freeze
|
|
62
|
+
STATE_ATTRS = PROTECT_STATE_ATTRS | ASSESS_STATE_ATTRS | APPLICATION_STATE_ATTRS
|
|
63
|
+
|
|
64
|
+
# Meta-define an accessor for each state attribute.
|
|
65
|
+
begin
|
|
66
|
+
PROTECT_STATE_ATTRS.each do |attr|
|
|
67
|
+
define_method(attr) do
|
|
68
|
+
protect_state[attr]
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
ASSESS_STATE_ATTRS.each do |attr|
|
|
73
|
+
define_method(attr) do
|
|
74
|
+
assess_state[attr]
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
APPLICATION_STATE_ATTRS.each do |attr|
|
|
79
|
+
define_method(attr) do
|
|
80
|
+
application_state[attr]
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def initialize
|
|
86
|
+
reset_state
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Wipe state to zero.
|
|
90
|
+
def reset_state
|
|
91
|
+
@assess_rules = {}
|
|
92
|
+
@protect_rules = {}
|
|
93
|
+
|
|
94
|
+
@tainted_columns = {}
|
|
95
|
+
|
|
96
|
+
@assess_state = nil
|
|
97
|
+
@protect_state = nil
|
|
98
|
+
@application_state = nil
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def build_assess_rules
|
|
102
|
+
@assess_rules = {}
|
|
103
|
+
|
|
104
|
+
Contrast::Agent::Assess::Rule::Csrf.new
|
|
105
|
+
Contrast::Agent::Assess::Rule::Redos.new
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def build_protect_rules
|
|
109
|
+
@protect_rules = {}
|
|
110
|
+
|
|
111
|
+
# rules
|
|
112
|
+
Contrast::Agent::Protect::Rule::CmdInjection.new
|
|
113
|
+
Contrast::Agent::Protect::Rule::Deserialization.new
|
|
114
|
+
Contrast::Agent::Protect::Rule::HttpMethodTampering.new
|
|
115
|
+
Contrast::Agent::Protect::Rule::NoSqli.new
|
|
116
|
+
Contrast::Agent::Protect::Rule::PathTraversal.new
|
|
117
|
+
Contrast::Agent::Protect::Rule::Sqli.new
|
|
118
|
+
Contrast::Agent::Protect::Rule::UnsafeFileUpload.new
|
|
119
|
+
Contrast::Agent::Protect::Rule::Xss.new
|
|
120
|
+
Contrast::Agent::Protect::Rule::Xxe.new
|
|
121
|
+
|
|
122
|
+
# Beta Rules
|
|
123
|
+
Contrast::Agent::Protect::Rule::Csrf.new
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def protect_rule name
|
|
127
|
+
@protect_rules[name]
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# these are less 'settings' and more 'how do I behave.'
|
|
131
|
+
# relocate to Agent or Assess/Protect.
|
|
132
|
+
def protect_rule_mode rule_id
|
|
133
|
+
CONFIG.root.protect.rules[rule_id]&.mode || modes_by_id[rule_id] || :NO_ACTION
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
COMPONENT_INTERFACE = Interface.new
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Copyright (c) 2020 Contrast Security, Inc. See https://www.contrastsecurity.com/enduser-terms-0317a for more details.
|
|
2
|
+
# frozen_string_literal: true
|
|
3
|
+
|
|
4
|
+
module Contrast
|
|
5
|
+
# This is the base module for our configuration classes. It is intended to
|
|
6
|
+
# facilitate the translation of the Common Configuration settings to usable
|
|
7
|
+
# Ruby classes. Any class under this namespace should be required here,
|
|
8
|
+
# providing a single point of require for this functionality.
|
|
9
|
+
module Config
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
cs__scoped_require 'contrast/config/base_configuration'
|
|
14
|
+
cs__scoped_require 'contrast/config/default_value'
|
|
15
|
+
|
|
16
|
+
cs__scoped_require 'contrast/config/logger_configuration'
|
|
17
|
+
|
|
18
|
+
cs__scoped_require 'contrast/config/heap_dump_configuration'
|
|
19
|
+
cs__scoped_require 'contrast/config/service_configuration'
|
|
20
|
+
cs__scoped_require 'contrast/config/exception_configuration'
|
|
21
|
+
cs__scoped_require 'contrast/config/assess_rules_configuration'
|
|
22
|
+
cs__scoped_require 'contrast/config/protect_rule_configuration'
|
|
23
|
+
cs__scoped_require 'contrast/config/protect_rules_configuration'
|
|
24
|
+
cs__scoped_require 'contrast/config/sampling_configuration'
|
|
25
|
+
|
|
26
|
+
cs__scoped_require 'contrast/config/ruby_configuration'
|
|
27
|
+
cs__scoped_require 'contrast/config/agent_configuration'
|
|
28
|
+
cs__scoped_require 'contrast/config/application_configuration'
|
|
29
|
+
cs__scoped_require 'contrast/config/server_configuration'
|
|
30
|
+
cs__scoped_require 'contrast/config/assess_configuration'
|
|
31
|
+
cs__scoped_require 'contrast/config/inventory_configuration'
|
|
32
|
+
cs__scoped_require 'contrast/config/protect_configuration'
|
|
33
|
+
cs__scoped_require 'contrast/config/root_configuration'
|