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,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
|
+
cs__scoped_require 'contrast/components/interface'
|
|
5
|
+
|
|
6
|
+
module Contrast
|
|
7
|
+
module Utils
|
|
8
|
+
# A utility class to detect the environment the agent is operating within
|
|
9
|
+
class OperatingEnvironment
|
|
10
|
+
include Contrast::Components::Interface
|
|
11
|
+
access_component :logging
|
|
12
|
+
|
|
13
|
+
def self.unsupported?
|
|
14
|
+
sidekiq? || rake?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.sidekiq?
|
|
18
|
+
return unless defined?(Sidekiq) && Sidekiq.cs__respond_to?(:server?) && Sidekiq.server?
|
|
19
|
+
|
|
20
|
+
logger.debug(nil, "Detected the spawn of a Sidekiq process. Disabling Contrast for process #{ Process.pid }")
|
|
21
|
+
true
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.rake?
|
|
25
|
+
return unless defined?(Rake) &&
|
|
26
|
+
Rake.cs__respond_to?(:application) &&
|
|
27
|
+
Rake.application.cs__respond_to?(:top_level_tasks)
|
|
28
|
+
|
|
29
|
+
disabled_rake_tasks = Contrast::Agent::FeatureState.instance.disabled_agent_rake_tasks
|
|
30
|
+
disabled_task = Rake.application.top_level_tasks.any? { |task| disabled_rake_tasks.include?(task) }
|
|
31
|
+
return false unless disabled_task
|
|
32
|
+
|
|
33
|
+
logger.debug(nil, "Detected startup within the rake task #{ disabled_task }. Disabling Contrast for process #{ Process.pid }")
|
|
34
|
+
true
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
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 Utils
|
|
6
|
+
# Simple utility used to make OS calls and determine state. For that state
|
|
7
|
+
# which will not change at runtime, such as the operating system, the
|
|
8
|
+
# Utility memozies to avoid multiple lookups.
|
|
9
|
+
module OS
|
|
10
|
+
class << self
|
|
11
|
+
def windows?
|
|
12
|
+
@_windows = !(/cygwin|mswin|mingw|bccwin|wince|emx/ =~ RUBY_PLATFORM).nil? if @_windows.nil?
|
|
13
|
+
@_windows
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def mac?
|
|
17
|
+
@_mac ||= !(/darwin/ =~ RUBY_PLATFORM).nil? if @_mac.nil?
|
|
18
|
+
@_mac
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def unix?
|
|
22
|
+
@unix ||= !windows? if @_unix.nil?
|
|
23
|
+
@unix
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def linux?
|
|
27
|
+
@_linux ||= unix? && !OS.mac? if @_linux.nil?
|
|
28
|
+
@_linux
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def running?
|
|
32
|
+
process = if Contrast::Utils::OS.windows?
|
|
33
|
+
`tasklist /fi "imagename eq contrast-service.exe"`
|
|
34
|
+
else
|
|
35
|
+
`ps aux | grep contrast-servic[e]`
|
|
36
|
+
end
|
|
37
|
+
process != ''
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# check if service was killed and is a zombie process
|
|
41
|
+
# returns an array of zombie process PIDs as strings; empty array if there are none
|
|
42
|
+
def zombie_pids
|
|
43
|
+
zombie_pid_list = `ps aux | grep contrast-servic[e] | grep Z | awk '{print $2}'` # retrieve pid of service processes
|
|
44
|
+
zombie_pid_list.split("\n")
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,151 @@
|
|
|
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 'contrast/utils/object_share'
|
|
5
|
+
cs__scoped_require 'contrast/utils/class_util'
|
|
6
|
+
cs__scoped_require 'contrast/components/interface'
|
|
7
|
+
|
|
8
|
+
module Contrast
|
|
9
|
+
module Utils
|
|
10
|
+
# Utility methods for finding routes within frameworks
|
|
11
|
+
class PathUtil
|
|
12
|
+
include Contrast::Components::Interface
|
|
13
|
+
access_component :logging
|
|
14
|
+
|
|
15
|
+
COVERAGE_LIMIT = 500 # CONTRAST-25730: Arbitrary coverage limit imposed by TeamServer
|
|
16
|
+
|
|
17
|
+
class << self
|
|
18
|
+
# find the routes in the application. since each framework maintains the
|
|
19
|
+
# routes slightly differently, we'll only support those that we've explicitly
|
|
20
|
+
# implemented (Rails & Sinatra currently)
|
|
21
|
+
#
|
|
22
|
+
# this method always returns an array, even if it's empty
|
|
23
|
+
def find_routes
|
|
24
|
+
if defined?(Rails)
|
|
25
|
+
find_rails_routes
|
|
26
|
+
elsif defined?(Sinatra)
|
|
27
|
+
find_sinatra_routes
|
|
28
|
+
else
|
|
29
|
+
Contrast::Utils::ObjectShare::EMPTY_ARRAY
|
|
30
|
+
end
|
|
31
|
+
rescue StandardError
|
|
32
|
+
Contrast::Utils::ObjectShare::EMPTY_ARRAY
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Given the Contrast Request object, determine the current Coverage route,
|
|
36
|
+
# returning a RouteCoverage object
|
|
37
|
+
def get_route request
|
|
38
|
+
get_rails_route(request) if defined?(Rails)
|
|
39
|
+
rescue StandardError => e
|
|
40
|
+
logger.error(e, 'Unable to generate route from request')
|
|
41
|
+
nil
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def find_rails_routes
|
|
45
|
+
routes = []
|
|
46
|
+
count = 0
|
|
47
|
+
Rails.application.routes.routes.each do |route|
|
|
48
|
+
routes << rails_route_to_coverage(route)
|
|
49
|
+
count += 1
|
|
50
|
+
return routes if count > COVERAGE_LIMIT
|
|
51
|
+
end
|
|
52
|
+
routes
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def get_rails_route request
|
|
56
|
+
return unless Rails.cs__respond_to?(:application)
|
|
57
|
+
|
|
58
|
+
# returns array of arrays [[match_data, path_parameters, route]], sorted by
|
|
59
|
+
# precedence
|
|
60
|
+
# match_data: ActionDispatch::Journey::Path::Pattern::MatchData
|
|
61
|
+
# path_parameters: hash of various things
|
|
62
|
+
# route: ActionDispatch::Journey::Route
|
|
63
|
+
full_routes = Rails.application.routes.router.send(:find_routes, request.rack_request)
|
|
64
|
+
return if full_routes.empty?
|
|
65
|
+
|
|
66
|
+
full_route = full_routes[0] # [match_data, path_parameters, route]
|
|
67
|
+
return unless full_route
|
|
68
|
+
|
|
69
|
+
route = full_route[2] # route w/ highest precedence
|
|
70
|
+
return unless route
|
|
71
|
+
|
|
72
|
+
rails_route_to_coverage(route)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Convert ActionDispatch::Journey::Route to Contrast::Api::Dtm::RouteCoverage
|
|
76
|
+
def rails_route_to_coverage route
|
|
77
|
+
route_coverage = Contrast::Api::Dtm::RouteCoverage.new
|
|
78
|
+
route_coverage.route = "#{ route.defaults[:controller] }##{ route.defaults[:action] }"
|
|
79
|
+
|
|
80
|
+
verb = source_or_string(route.verb)
|
|
81
|
+
route_coverage.verb = Contrast::Utils::StringUtils.force_utf8(verb)
|
|
82
|
+
|
|
83
|
+
url = source_or_string(route.path.spec)
|
|
84
|
+
route_coverage.url = Contrast::Utils::StringUtils.force_utf8(url)
|
|
85
|
+
route_coverage
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def source_or_string obj
|
|
89
|
+
if obj.cs__is_a?(Regexp)
|
|
90
|
+
obj.source
|
|
91
|
+
elsif obj.cs__respond_to?(:safe_string)
|
|
92
|
+
obj.safe_string
|
|
93
|
+
else
|
|
94
|
+
obj.to_s
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Iterate over every class that extends Sinatra::Base, pull out its routes
|
|
99
|
+
# (array of arrays with Mustermann::Sinatra as [][0]) and convert them into
|
|
100
|
+
# Contrast::Api::Dtm::RouteCoverage
|
|
101
|
+
def find_sinatra_routes
|
|
102
|
+
routes = []
|
|
103
|
+
controllers = sinatra_controllers
|
|
104
|
+
controllers.each do |clazz|
|
|
105
|
+
class_routes = sinatra_class_routes(clazz)
|
|
106
|
+
next unless class_routes
|
|
107
|
+
|
|
108
|
+
class_routes.each_pair do |method, list|
|
|
109
|
+
# item: [ Mustermann::Sinatra, [], Proc]
|
|
110
|
+
list.each do |item|
|
|
111
|
+
routes << sinatra_route_to_coverage(clazz, method, item[0])
|
|
112
|
+
return routes if routes.length > COVERAGE_LIMIT
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
routes
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def sinatra_controllers
|
|
120
|
+
return [] unless defined?(Sinatra) && defined?(Sinatra::Base)
|
|
121
|
+
|
|
122
|
+
Contrast::Utils::ClassUtil.ancestors_of(Sinatra::Base)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def sinatra_class_routes controller
|
|
126
|
+
controller.instance_variable_get(:@routes)
|
|
127
|
+
rescue StandardError
|
|
128
|
+
logger.debug(nil, "#{ clazz } has no routes instance")
|
|
129
|
+
nil
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Invoked directly on Sinatra::Base#call!
|
|
133
|
+
def get_sinatra_route clazz, method, pattern
|
|
134
|
+
sinatra_route_to_coverage(clazz, method, pattern)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# given clazz, method, and Mustermann::Sinatra, build a
|
|
138
|
+
# Contrast::Api::Dtm::RouteCoverage
|
|
139
|
+
def sinatra_route_to_coverage clazz, method, pattern
|
|
140
|
+
safe_pattern = source_or_string(pattern)
|
|
141
|
+
|
|
142
|
+
route_coverage = Contrast::Api::Dtm::RouteCoverage.new
|
|
143
|
+
route_coverage.route = "#{ clazz }##{ method } #{ safe_pattern }"
|
|
144
|
+
route_coverage.verb = Contrast::Utils::StringUtils.force_utf8(method)
|
|
145
|
+
route_coverage.url = Contrast::Utils::StringUtils.force_utf8(safe_pattern)
|
|
146
|
+
route_coverage
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
@@ -0,0 +1,152 @@
|
|
|
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 'contrast/utils/object_share'
|
|
5
|
+
cs__scoped_require 'contrast/components/interface'
|
|
6
|
+
|
|
7
|
+
module Contrast
|
|
8
|
+
module Utils
|
|
9
|
+
# This utility allows us wrap our calls to logging, allowing runtime
|
|
10
|
+
# determination as to whether or not an event should be logged, based upon
|
|
11
|
+
# the Logging Configuration as specified in Common Configuration.
|
|
12
|
+
module PerformsLogging
|
|
13
|
+
include Contrast::Components::Interface
|
|
14
|
+
|
|
15
|
+
COULDNT_INIT_CONFIG = '!!! Contrast could not initialize agent from config, flushing loq queue to TARGET !!!'
|
|
16
|
+
FLUSHING_LOG_QUEUE = '!!! Contrast exited before logger could initialize, flushing log queue to TARGET !!!'
|
|
17
|
+
|
|
18
|
+
TARGET = STDOUT
|
|
19
|
+
|
|
20
|
+
# idiom for propagating class methods
|
|
21
|
+
def self.included base
|
|
22
|
+
base.send :include, InstanceMethods
|
|
23
|
+
base.extend ClassMethods
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Grouping to allow for these methods to be included into another Module
|
|
27
|
+
# on include of the PerformsLogging Module. They'll function as instance
|
|
28
|
+
# methods in that Module.
|
|
29
|
+
module InstanceMethods #:nodoc:
|
|
30
|
+
@_log_mutex = Mutex.new
|
|
31
|
+
@_log_queue = []
|
|
32
|
+
|
|
33
|
+
protected
|
|
34
|
+
|
|
35
|
+
def init_log_queueing
|
|
36
|
+
# Queue log messages & defer logging until logger gets initialized.
|
|
37
|
+
# (Logger depends on config, so logging config errors implies
|
|
38
|
+
# circular dependencies.)
|
|
39
|
+
at_exit do
|
|
40
|
+
# Ideally we flush the queue when we detect agent init is impossible,
|
|
41
|
+
# if worse comes to worse we do it here.
|
|
42
|
+
if @_log_queue
|
|
43
|
+
lq = @_log_queue
|
|
44
|
+
if lq&.any?
|
|
45
|
+
TARGET.puts '!!! Contrast exited before logger could initialize, flushing log queue to TARGET !!!'
|
|
46
|
+
while (message = lq.pop)
|
|
47
|
+
TARGET.puts "[#{ message[2].upcase }]\t#{ message[1] }"
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def abort_log_queues
|
|
55
|
+
TARGET.puts COULDNT_INIT_CONFIG
|
|
56
|
+
if @_log_queue
|
|
57
|
+
TARGET.puts FLUSHING_LOG_QUEUE
|
|
58
|
+
while (message = @_log_queue.pop)
|
|
59
|
+
TARGET.puts "[#{ message[2].upcase }]\t#{ message[1] }"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
@_log_queue = nil
|
|
63
|
+
@_log_mutex = nil
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def flush_log_queues
|
|
67
|
+
return unless @_log_queue
|
|
68
|
+
|
|
69
|
+
# Monkeypatch this class so that the next call to #instance flushes the log queue.
|
|
70
|
+
# (Flushing the log queue within #initialize
|
|
71
|
+
# causes a deadlock, as singleton classes' #initialize
|
|
72
|
+
# gets wrapped within a mutex, and our logger will
|
|
73
|
+
# try to reference the singleton instance.)
|
|
74
|
+
self.class.class_eval do
|
|
75
|
+
class << self
|
|
76
|
+
alias_method :__instance_original, :instance
|
|
77
|
+
def instance
|
|
78
|
+
@_log_mutex.synchronize do
|
|
79
|
+
# Restore old #instance method.
|
|
80
|
+
class_eval do
|
|
81
|
+
class << self
|
|
82
|
+
def instance
|
|
83
|
+
__instance_original
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
# Flush log queue.
|
|
88
|
+
if @_log_queue
|
|
89
|
+
while (message = @_log_queue.pop)
|
|
90
|
+
log_with_level(*message, skip_queue: true)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
@_log_queue = nil
|
|
94
|
+
end
|
|
95
|
+
@_log_mutex = nil
|
|
96
|
+
__instance_original
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
module ClassMethods #:nodoc:
|
|
104
|
+
def log_error msg, exception = nil
|
|
105
|
+
log_with_level exception, msg, :error
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def log_warn msg, exception = nil
|
|
109
|
+
log_with_level exception, msg, :warn
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def log_info msg, exception = nil
|
|
113
|
+
log_with_level exception, msg, :info
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def log_debug msg, exception = nil
|
|
117
|
+
log_with_level exception, msg, :debug
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def debug_with_time msg
|
|
121
|
+
a = Contrast::Utils::Timer.now_ms
|
|
122
|
+
ret = yield if block_given?
|
|
123
|
+
z = Contrast::Utils::Timer.now_ms
|
|
124
|
+
log_with_level(nil, "#{ msg }: pid=#{ Process.pid }, elapsed=#{ z - a }ms", :debug)
|
|
125
|
+
ret
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def log_with_level exception, msg, level, skip_queue: false
|
|
129
|
+
# Log messages are queued until the logger is initialized.
|
|
130
|
+
# If agent init fails, flush the log to TARGET.
|
|
131
|
+
if (lq = @_log_queue) && !skip_queue
|
|
132
|
+
lq.push [exception, msg, level]
|
|
133
|
+
return nil
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
if exception&.respond_to?(:message)
|
|
137
|
+
tmp = msg.nil? ? exception.message.to_s : "#{ exception.class.name }: #{ msg }: #{ exception.message }"
|
|
138
|
+
logger.send(level, tmp)
|
|
139
|
+
|
|
140
|
+
exception.backtrace.first(10).each { |line| logger.debug(line) } if logger.debug? && exception.cs__respond_to?(:backtrace) && exception.backtrace
|
|
141
|
+
elsif msg.to_s != Contrast::Utils::ObjectShare::EMPTY_STRING
|
|
142
|
+
logger.send(level, msg.to_s)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
nil # ensure no return value
|
|
146
|
+
rescue StandardError
|
|
147
|
+
nil # NOOP
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
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 Utils
|
|
6
|
+
# Utility for generating preflight message token
|
|
7
|
+
class PreflightUtil
|
|
8
|
+
def self.create_preflight finding
|
|
9
|
+
"#{ finding.rule_id },#{ finding.hash_code }"
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
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 Utils
|
|
6
|
+
# DO NOT REMOVE THIS!
|
|
7
|
+
#
|
|
8
|
+
# Marshal is pretty cool. It does a lot of things well. What it doesn't
|
|
9
|
+
# mess around with though is StringIO. And what we don't want to do is
|
|
10
|
+
# serialize ourselves out with Marshal#dump.
|
|
11
|
+
#
|
|
12
|
+
# Unfortunately, we have to mess around w/ that. To isolate our things from
|
|
13
|
+
# user dumped Strings (and so that we can marshal findings), we have
|
|
14
|
+
# decided to make this class not marshalled.
|
|
15
|
+
module PreventMarshalSerialization
|
|
16
|
+
def marshal_dump
|
|
17
|
+
nil
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def marshal_load *_args
|
|
21
|
+
nil
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# DO NOT REMOVE THIS!
|
|
26
|
+
#
|
|
27
|
+
# Psych/YAML is also pretty cool. But it doesn't mess with anonymous
|
|
28
|
+
# classes. In order to make things we extend serializable, we need to make
|
|
29
|
+
# sure we play nice.
|
|
30
|
+
module PreventPsychSerialization
|
|
31
|
+
def encode_with *_args
|
|
32
|
+
nil
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def init_with *_args
|
|
36
|
+
nil
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# DO NOT REMOVE THIS!
|
|
41
|
+
#
|
|
42
|
+
# This module is used to prevent deserialization of our classes, not b/c
|
|
43
|
+
# we're trying to be sneaky, but b/c there is a high probability that the
|
|
44
|
+
# events we're capturing have non-serializable data in them and b/c we
|
|
45
|
+
# can't be sure the serialized data will be used in an application running
|
|
46
|
+
# Contrast.
|
|
47
|
+
module PreventSerialization
|
|
48
|
+
include PreventMarshalSerialization
|
|
49
|
+
include PreventPsychSerialization
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|