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,31 @@
|
|
|
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/api/socket'
|
|
5
|
+
|
|
6
|
+
module Contrast
|
|
7
|
+
module Api
|
|
8
|
+
# This class allows us to create a TCP Socket to communicate to the Service
|
|
9
|
+
# (Speed Racer). Either it or the Unix Socket will be used, as determined
|
|
10
|
+
# by the configuration options set for Service communication.
|
|
11
|
+
class TcpSocket
|
|
12
|
+
include Contrast::Api::Socket
|
|
13
|
+
|
|
14
|
+
LOCAL_HOSTS = %w[localhost 127.0.0.1 0.0.0.0 ::1].cs__freeze
|
|
15
|
+
|
|
16
|
+
attr_reader :host, :port
|
|
17
|
+
|
|
18
|
+
# Create the socket
|
|
19
|
+
# @param host [String] socket target hostname or IP address
|
|
20
|
+
# @param port [String,Integer] socket target port
|
|
21
|
+
def initialize host, port
|
|
22
|
+
@host = host.to_s
|
|
23
|
+
@port = port.to_i
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def new_socket
|
|
27
|
+
::TCPSocket.new(host, port)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
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/api/socket'
|
|
5
|
+
|
|
6
|
+
module Contrast
|
|
7
|
+
module Api
|
|
8
|
+
# Implements a UNIX domain socket to connect to the Contrast Service.
|
|
9
|
+
class UnixSocket
|
|
10
|
+
include Contrast::Api::Socket
|
|
11
|
+
|
|
12
|
+
attr_reader :path
|
|
13
|
+
|
|
14
|
+
# Create the socket
|
|
15
|
+
# @param path [String] file path to a UNIX domain socket
|
|
16
|
+
def initialize path
|
|
17
|
+
@path = path
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def new_socket
|
|
21
|
+
::UNIXSocket.new(path)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
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
|
+
# rubocop:disable Style/MethodMissingSuper, Style/MissingRespondToMissing
|
|
5
|
+
module Contrast
|
|
6
|
+
# A wrapper build around the Common Agent Configuration project to allow for
|
|
7
|
+
# access of the values contained in its parent_configuration_spec.yaml
|
|
8
|
+
class CommonAgentConfiguration
|
|
9
|
+
# The CAC spec, deserialized to a hash.
|
|
10
|
+
|
|
11
|
+
SPEC = 'spec'
|
|
12
|
+
NODES = 'nodes'
|
|
13
|
+
PROPERTIES = 'properties'
|
|
14
|
+
|
|
15
|
+
def initialize hsh
|
|
16
|
+
@hsh = hsh[SPEC]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Used to indicate those sections of the configuration which have
|
|
20
|
+
# references to other nodes or properties, allowing for the parsing of and
|
|
21
|
+
# access to the nested configuration structure.
|
|
22
|
+
module IsANode
|
|
23
|
+
def children
|
|
24
|
+
hsh[NODES]&.map { |raw_node| Node.new(raw_node) } || []
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def properties
|
|
28
|
+
hsh[PROPERTIES].map { |raw_property| Property.new(raw_property) }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def lookup *path
|
|
32
|
+
# Path will be N args, representing a path of nodes.
|
|
33
|
+
path.reduce(self) do |node, next_arg|
|
|
34
|
+
# If we can travel to a node by that name, do that.
|
|
35
|
+
candidate_node = node.children.find { |n| n.name == next_arg }
|
|
36
|
+
next candidate_node if candidate_node
|
|
37
|
+
|
|
38
|
+
# If there's a property, dereference that.
|
|
39
|
+
candidate_property = node.properties.find { |n| n.name == next_arg }
|
|
40
|
+
next candidate_property if candidate_property
|
|
41
|
+
|
|
42
|
+
raise IndexError, "couldn't traverse path:\t#{ path.join(Contrast::Utils::ObjectShare::PERIOD) }"
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def method_missing method, *args, &block
|
|
47
|
+
if args.any?
|
|
48
|
+
lookup(method.to_s).public_send(args, block)
|
|
49
|
+
else
|
|
50
|
+
lookup(method.to_s)
|
|
51
|
+
end
|
|
52
|
+
rescue IndexError
|
|
53
|
+
super(method, args, block)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Used to indicate those sections of the configuration which are for a
|
|
58
|
+
# single property, allowing for the parsing of and access to the
|
|
59
|
+
# information describing the property.
|
|
60
|
+
module IsAProperty
|
|
61
|
+
attr_reader :hsh
|
|
62
|
+
|
|
63
|
+
def initialize hsh
|
|
64
|
+
@hsh = hsh
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
%w[name default description required_languages display].each do |field|
|
|
68
|
+
define_method(field) { hsh[field].dup }
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
include IsANode
|
|
73
|
+
include IsAProperty
|
|
74
|
+
|
|
75
|
+
# A Property in the Common Agent Configuration
|
|
76
|
+
class Property
|
|
77
|
+
include IsAProperty
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# A Node in the Common Agent Configuration
|
|
81
|
+
class Node < Property
|
|
82
|
+
include IsANode
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
# rubocop:enable Style/MethodMissingSuper, Style/MissingRespondToMissing
|
|
@@ -0,0 +1,85 @@
|
|
|
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 Agent
|
|
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 Agent.
|
|
11
|
+
class Interface
|
|
12
|
+
include Contrast::Components::ComponentBase
|
|
13
|
+
include Contrast::Components::Interface
|
|
14
|
+
|
|
15
|
+
access_component :config
|
|
16
|
+
|
|
17
|
+
def enabled?
|
|
18
|
+
!!@enabled
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def disabled?
|
|
22
|
+
!enabled?
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def enable!
|
|
26
|
+
@enabled = true
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def disable!
|
|
30
|
+
@enabled = false
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def unavailable?
|
|
34
|
+
!enabled?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def ready?
|
|
38
|
+
state.agent_ready?
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def patch_interpolation?
|
|
42
|
+
interpolation_patch_possible?
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def rewrite_interpolation?
|
|
46
|
+
!interpolation_patch_possible?
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def interpolation_enabled?
|
|
50
|
+
!Contrast::Utils::BooleanUtil.false?(CONFIG.root.agent.ruby.interpolate)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def report_custom_code_sysfile_access?
|
|
54
|
+
Contrast::Agent::FeatureState.instance.report_custom_code_sysfile_access?
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# TODO: RUBY-564 Move instrumentation to a new component that handles
|
|
58
|
+
# one-time agent initialization procedures.
|
|
59
|
+
SHARED_LIBRARIES = %w[contrast/core_extensions/thread
|
|
60
|
+
contrast/rails_extensions/rack
|
|
61
|
+
contrast/rails_extensions/buffer
|
|
62
|
+
contrast/sinatra_extensions/assess/cookie].cs__freeze
|
|
63
|
+
def run_instrumentation
|
|
64
|
+
Contrast::Agent::FeatureState.instance.tap do |settings|
|
|
65
|
+
SHARED_LIBRARIES.each { |lib| settings.instrument lib }
|
|
66
|
+
end
|
|
67
|
+
Contrast::Agent::Patching::Policy::Patcher.patch # This acts as a catch up for everything we didn't see get loaded
|
|
68
|
+
enable_tracepoint # This handles all class loads & required instrumentation going forward
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def enable_tracepoint
|
|
72
|
+
Contrast::Agent::TracePointHook.enable!
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
protected
|
|
76
|
+
|
|
77
|
+
def interpolation_patch_possible?
|
|
78
|
+
Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6.0')
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
COMPONENT_INTERFACE = Interface.new
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,188 @@
|
|
|
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/core_extensions/object'
|
|
5
|
+
cs__scoped_require 'contrast/utils/sinatra_helper'
|
|
6
|
+
|
|
7
|
+
module Contrast
|
|
8
|
+
module Components
|
|
9
|
+
module AppContext
|
|
10
|
+
# A wrapper build around the Common Agent Configuration project to allow
|
|
11
|
+
# for access of the values contained in its
|
|
12
|
+
# parent_configuration_spec.yaml.
|
|
13
|
+
# Specifically, this allows for querying the state of the Application,
|
|
14
|
+
# including the Client, Process, and Server information.
|
|
15
|
+
class Interface
|
|
16
|
+
include Contrast::Components::ComponentBase
|
|
17
|
+
include Contrast::Components::Interface
|
|
18
|
+
|
|
19
|
+
access_component :config
|
|
20
|
+
|
|
21
|
+
DEFAULT_APP_NAME = 'rails'
|
|
22
|
+
DEFAULT_APP_PATH = '/'
|
|
23
|
+
DEFAULT_SERVER_NAME = 'localhost'
|
|
24
|
+
DEFAULT_SERVER_PATH = '/'
|
|
25
|
+
|
|
26
|
+
RAILS_TYPE = 'rails'
|
|
27
|
+
SINATRA_TYPE = 'sinatra'
|
|
28
|
+
RACK_TYPE = 'rack'
|
|
29
|
+
|
|
30
|
+
RAILS_MODULE_NAME_VERSION = Gem::Version.new('6.0.0')
|
|
31
|
+
|
|
32
|
+
def present? str
|
|
33
|
+
Contrast::Utils::EnvironmentUtil.present?(str)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def server_type
|
|
37
|
+
@_server_type ||= begin
|
|
38
|
+
tmp = CONFIG.root.server.type
|
|
39
|
+
tmp = framework_server_name unless present?(tmp)
|
|
40
|
+
tmp
|
|
41
|
+
rescue StandardError
|
|
42
|
+
RACK_TYPE
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def framework_server_name
|
|
47
|
+
@_framework_server_name ||= begin
|
|
48
|
+
if defined?(Rails)
|
|
49
|
+
RAILS_TYPE
|
|
50
|
+
elsif defined?(Sinatra)
|
|
51
|
+
SINATRA_TYPE
|
|
52
|
+
else
|
|
53
|
+
RACK_TYPE
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def name
|
|
59
|
+
@_name ||= begin
|
|
60
|
+
tmp = CONFIG.root.application.name
|
|
61
|
+
tmp = framework_app_name unless present?(tmp)
|
|
62
|
+
tmp = File.basename(Dir.pwd) unless present?(tmp)
|
|
63
|
+
Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_APP_NAME)
|
|
64
|
+
rescue StandardError
|
|
65
|
+
DEFAULT_APP_NAME
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def framework_app_name
|
|
70
|
+
@_framework_app_name ||= begin
|
|
71
|
+
name = find_rails_app_name
|
|
72
|
+
name ||= find_sinatra_app_name
|
|
73
|
+
name
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def path
|
|
78
|
+
@_path ||= begin
|
|
79
|
+
tmp = CONFIG.root.application.path
|
|
80
|
+
Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_APP_PATH)
|
|
81
|
+
rescue StandardError
|
|
82
|
+
DEFAULT_APP_PATH
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def server_name
|
|
87
|
+
@_server_name ||= begin
|
|
88
|
+
tmp = CONFIG.root.server.name
|
|
89
|
+
tmp = Socket.gethostname unless present?(tmp)
|
|
90
|
+
tmp = Contrast::Utils::StringUtils.force_utf8(tmp)
|
|
91
|
+
Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_SERVER_NAME)
|
|
92
|
+
rescue StandardError
|
|
93
|
+
DEFAULT_SERVER_NAME
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def server_path
|
|
98
|
+
@_server_path ||= begin
|
|
99
|
+
tmp = CONFIG.root.server.path
|
|
100
|
+
tmp = Dir.pwd unless present?(tmp)
|
|
101
|
+
Contrast::Utils::StringUtils.truncate(tmp, DEFAULT_SERVER_PATH)
|
|
102
|
+
rescue StandardError
|
|
103
|
+
DEFAULT_SERVER_PATH
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def build_app_startup_message
|
|
108
|
+
msg = Contrast::Api::Dtm::ApplicationCreate.new
|
|
109
|
+
|
|
110
|
+
app_ver = if CONFIG.root.application.version.to_s.empty?
|
|
111
|
+
Contrast::Utils::EnvironmentUtil.determine_application_version
|
|
112
|
+
else
|
|
113
|
+
CONFIG.root.application.version
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
msg.group = protobuf_format CONFIG.root.application.group
|
|
117
|
+
msg.tags = protobuf_format CONFIG.root.application.tags
|
|
118
|
+
msg.app_version = protobuf_format app_ver
|
|
119
|
+
msg.code = protobuf_format CONFIG.root.application.code
|
|
120
|
+
msg.metadata = protobuf_format CONFIG.root.application.metadata
|
|
121
|
+
# Other fields have limits in TeamServer, the rest don't.
|
|
122
|
+
msg.session_id = protobuf_format CONFIG.root.application.session_id, truncate: false
|
|
123
|
+
msg.session_metadata = protobuf_format CONFIG.root.application.session_metadata, truncate: false
|
|
124
|
+
|
|
125
|
+
msg
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
LOG_BUILD_STARTUP = 'build startup message'
|
|
129
|
+
def build_agent_startup_message
|
|
130
|
+
msg = Contrast::Api::Dtm::AgentStartup.new
|
|
131
|
+
msg.server_name = protobuf_format server_name
|
|
132
|
+
msg.server_path = protobuf_format server_path
|
|
133
|
+
msg.server_type = protobuf_format server_type
|
|
134
|
+
msg.server_version = Contrast::Agent::VERSION
|
|
135
|
+
msg.version = protobuf_format CONFIG.root.server.version
|
|
136
|
+
msg.environment = protobuf_format CONFIG.root.server.environment
|
|
137
|
+
msg.tags = protobuf_format CONFIG.root.server.tags
|
|
138
|
+
msg
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def pid
|
|
142
|
+
Process.pid
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def ppid
|
|
146
|
+
Process.ppid
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def pgid
|
|
150
|
+
Process.getpgid(pid)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
def client_id
|
|
154
|
+
@_client_id ||= [name, pgid].join('-')
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
private
|
|
158
|
+
|
|
159
|
+
def find_sinatra_app_name
|
|
160
|
+
sinatra_app = Contrast::Utils::SinatraHelper.app_class
|
|
161
|
+
return unless sinatra_app
|
|
162
|
+
|
|
163
|
+
sinatra_app.cs__class.cs__name
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def find_rails_app_name
|
|
167
|
+
return nil unless defined?(Rails)
|
|
168
|
+
|
|
169
|
+
# Rails version 6.0.0 deprecated Rails::Application#parent_name, in Rails 6.1.0 that method will be removed entirely
|
|
170
|
+
# and instead we need to use parent_module_name
|
|
171
|
+
return Rails.application.cs__class.parent_module_name if Gem::Version.new(Rails.version) >= RAILS_MODULE_NAME_VERSION
|
|
172
|
+
|
|
173
|
+
Rails.application.cs__class.parent_name
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# TODO: RUBY-120, move this responsibility toward the protobuf object
|
|
177
|
+
def protobuf_format param, truncate: true
|
|
178
|
+
param = param&.to_s
|
|
179
|
+
param = Contrast::Utils::StringUtils.force_utf8(param)
|
|
180
|
+
param = Contrast::Utils::StringUtils.truncate(param) if truncate
|
|
181
|
+
param
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
COMPONENT_INTERFACE = Interface.new
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
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 Assess
|
|
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 Assess product.
|
|
11
|
+
class Interface
|
|
12
|
+
include Contrast::Components::ComponentBase
|
|
13
|
+
include Contrast::Components::Interface
|
|
14
|
+
|
|
15
|
+
access_component :settings
|
|
16
|
+
|
|
17
|
+
def enabled?
|
|
18
|
+
return false unless defined?(Contrast::Agent::FeatureState)
|
|
19
|
+
|
|
20
|
+
state.assess_enabled?
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def tainted_columns
|
|
24
|
+
SETTINGS.tainted_columns
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def forcibly_disabled?
|
|
28
|
+
state.assess_forcibly_disabled?
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def rule_disabled? name
|
|
32
|
+
state.assess_rule_disabled? name
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def disabled_rules
|
|
36
|
+
state.assess_disabled_rules
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def scan_response?
|
|
40
|
+
state.scan_response?
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def track_frozen_sources?
|
|
44
|
+
state.assess_track_frozen_sources?
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def require_scan?
|
|
48
|
+
state.require_scanning_enabled?
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def tags
|
|
52
|
+
state.assess_tags
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def rules
|
|
56
|
+
SETTINGS.assess_rules
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def rule name
|
|
60
|
+
SETTINGS.assess_rules[name]
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
COMPONENT_INTERFACE = Interface.new
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|