console1984 0.1.4 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +32 -10
  3. data/config/protections.yml +30 -0
  4. data/lib/console1984/command_executor.rb +90 -0
  5. data/lib/console1984/command_validator/forbidden_constant_reference_validation.rb +31 -0
  6. data/lib/console1984/command_validator/forbidden_reopening_validation.rb +29 -0
  7. data/lib/console1984/command_validator/parsed_command.rb +90 -0
  8. data/lib/console1984/command_validator/suspicious_terms_validation.rb +22 -0
  9. data/lib/console1984/command_validator.rb +71 -0
  10. data/lib/console1984/config.rb +21 -9
  11. data/lib/console1984/engine.rb +6 -8
  12. data/lib/console1984/errors.rb +10 -1
  13. data/lib/console1984/ext/active_record/protected_auditable_tables.rb +28 -0
  14. data/lib/console1984/ext/core/module.rb +15 -0
  15. data/lib/console1984/ext/core/object.rb +43 -0
  16. data/lib/console1984/ext/irb/commands.rb +16 -0
  17. data/lib/console1984/ext/irb/context.rb +20 -0
  18. data/lib/console1984/{protected_tcp_socket.rb → ext/socket/tcp_socket.rb} +10 -4
  19. data/lib/console1984/freezeable.rb +70 -0
  20. data/lib/console1984/{supervisor/input_output.rb → input_output.rb} +9 -3
  21. data/lib/console1984/messages.rb +0 -10
  22. data/lib/console1984/protections_config.rb +17 -0
  23. data/lib/console1984/refrigerator.rb +32 -0
  24. data/lib/console1984/sessions_logger/database.rb +3 -1
  25. data/lib/console1984/shield/method_invocation_shell.rb +52 -0
  26. data/lib/console1984/shield/modes/protected.rb +27 -0
  27. data/lib/console1984/shield/modes/unprotected.rb +8 -0
  28. data/lib/console1984/shield/modes.rb +60 -0
  29. data/lib/console1984/shield.rb +85 -0
  30. data/lib/console1984/supervisor.rb +27 -22
  31. data/lib/console1984/username/env_resolver.rb +2 -0
  32. data/lib/console1984/version.rb +1 -1
  33. data/lib/console1984.rb +43 -21
  34. metadata +66 -14
  35. data/config/routes.rb +0 -9
  36. data/lib/console1984/commands.rb +0 -16
  37. data/lib/console1984/frozen_methods.rb +0 -17
  38. data/lib/console1984/protected_auditable_tables.rb +0 -29
  39. data/lib/console1984/protected_context.rb +0 -18
  40. data/lib/console1984/supervisor/accesses/protected.rb +0 -10
  41. data/lib/console1984/supervisor/accesses/unprotected.rb +0 -5
  42. data/lib/console1984/supervisor/accesses.rb +0 -41
  43. data/lib/console1984/supervisor/executor.rb +0 -41
  44. data/lib/console1984/supervisor/protector.rb +0 -37
data/config/routes.rb DELETED
@@ -1,9 +0,0 @@
1
- Console1984::Engine.routes.draw do
2
- resources :sessions, only: %i[ index show ] do
3
- resources :audits, only: %i[ create update ]
4
- end
5
-
6
- resource :filtered_sessions, only: %i[ update ]
7
-
8
- root to: "sessions#index"
9
- end
@@ -1,16 +0,0 @@
1
- module Console1984::Commands
2
- def decrypt!
3
- supervisor.enable_access_to_encrypted_content
4
- end
5
-
6
- def encrypt!
7
- supervisor.disable_access_to_encrypted_content
8
- end
9
-
10
- private
11
- def supervisor
12
- Console1984.supervisor
13
- end
14
-
15
- include Console1984::FrozenMethods
16
- end
@@ -1,17 +0,0 @@
1
- # Prevents adding new methods to classes.
2
- #
3
- # This prevents manipulating certain Console1984 classes
4
- # during a console session.
5
- module Console1984::FrozenMethods
6
- extend ActiveSupport::Concern
7
-
8
- module ClassMethods
9
- def method_added(method_name)
10
- raise Console1984::Errors::ForbiddenClassManipulation, "Can't override #{name}##{method_name}"
11
- end
12
-
13
- def singleton_method_added(method_name)
14
- raise Console1984::Errors::ForbiddenClassManipulation, "Can't override #{name}.#{method_name}"
15
- end
16
- end
17
- end
@@ -1,29 +0,0 @@
1
- module Console1984
2
- # Prevents accessing trail model tables when executing console commands.
3
- module ProtectedAuditableTables
4
- %i[ execute exec_query exec_insert exec_delete exec_update exec_insert_all ].each do |method|
5
- define_method method do |*args|
6
- sql = args.first
7
- if Console1984.supervisor.executing_user_command? && sql =~ auditable_tables_regexp
8
- raise Console1984::Errors::ForbiddenCommand, "#{sql}"
9
- else
10
- super(*args)
11
- end
12
- end
13
- end
14
-
15
- private
16
- AUDITABLE_MODELS = [ Console1984::User, Console1984::Session, Console1984::Command, Console1984::SensitiveAccess ]
17
-
18
- def auditable_tables_regexp
19
- @auditable_tables_regexp ||= Regexp.new("#{auditable_tables.join("|")}")
20
- end
21
-
22
- def auditable_tables
23
- # TODO: Not using Console1984::Base.descendants during development to make this work without eager loading
24
- @auditable_tables ||= AUDITABLE_MODELS.collect(&:table_name)
25
- end
26
- end
27
-
28
- include Console1984::FrozenMethods
29
- end
@@ -1,18 +0,0 @@
1
- module Console1984::ProtectedContext
2
- # This method is invoked for showing returned objects in the console
3
- # Overridden to make sure their evaluation is supervised.
4
- def inspect_last_value
5
- Console1984.supervisor.execute do
6
- super
7
- end
8
- end
9
-
10
- #
11
- def evaluate(line, line_no, exception: nil)
12
- Console1984.supervisor.execute_supervised(Array(line)) do
13
- super
14
- end
15
- end
16
-
17
- include Console1984::FrozenMethods
18
- end
@@ -1,10 +0,0 @@
1
- class Console1984::Supervisor::Accesses::Protected
2
- def execute(&block)
3
- Console1984.protecting(&block)
4
- end
5
-
6
- private
7
- def null_encryptor
8
- @null_encryptor ||= ActiveRecord::Encryption::NullEncryptor.new
9
- end
10
- end
@@ -1,5 +0,0 @@
1
- class Console1984::Supervisor::Accesses::Unprotected
2
- def execute(&block)
3
- block.call
4
- end
5
- end
@@ -1,41 +0,0 @@
1
- module Console1984::Supervisor::Accesses
2
- include Console1984::Messages
3
-
4
- PROTECTED_ACCESS = Protected.new
5
- UNPROTECTED_ACCESS = Unprotected.new
6
-
7
- def enable_access_to_encrypted_content(silent: false)
8
- run_system_command do
9
- show_warning Console1984.enter_unprotected_encryption_mode_warning if !silent && protected_mode?
10
- justification = ask_for_value "\nBefore you can access personal information, you need to ask for and get explicit consent from the user(s). #{current_username}, where can we find this consent (a URL would be great)?"
11
- session_logger.start_sensitive_access justification
12
- nil
13
- end
14
- ensure
15
- @access = UNPROTECTED_ACCESS
16
- nil
17
- end
18
-
19
- def disable_access_to_encrypted_content(silent: false)
20
- run_system_command do
21
- show_warning Console1984.enter_protected_mode_warning if !silent && unprotected_mode?
22
- session_logger.end_sensitive_access
23
- nil
24
- end
25
- ensure
26
- @access = PROTECTED_ACCESS
27
- nil
28
- end
29
-
30
- def with_encryption_mode(&block)
31
- @access.execute(&block)
32
- end
33
-
34
- def unprotected_mode?
35
- @access.is_a?(Unprotected)
36
- end
37
-
38
- def protected_mode?
39
- !unprotected_mode?
40
- end
41
- end
@@ -1,41 +0,0 @@
1
- module Console1984::Supervisor::Executor
2
- extend ActiveSupport::Concern
3
-
4
- def execute_supervised(commands, &block)
5
- run_system_command { session_logger.before_executing commands }
6
- execute(&block)
7
- rescue Console1984::Errors::ForbiddenCommand, Console1984::Errors::ForbiddenClassManipulation
8
- puts "Forbidden command attempted: #{commands.join("\n")}"
9
- run_system_command { session_logger.suspicious_commands_attempted commands }
10
- nil
11
- ensure
12
- run_system_command { session_logger.after_executing commands }
13
- end
14
-
15
- def execute(&block)
16
- run_user_command do
17
- with_encryption_mode(&block)
18
- end
19
- end
20
-
21
- def executing_user_command?
22
- @executing_user_command
23
- end
24
-
25
- private
26
- def run_user_command(&block)
27
- run_command true, &block
28
- end
29
-
30
- def run_system_command(&block)
31
- run_command false, &block
32
- end
33
-
34
- def run_command(run_by_user, &block)
35
- original_value = @executing_user_command
36
- @executing_user_command = run_by_user
37
- block.call
38
- ensure
39
- @executing_user_command = original_value
40
- end
41
- end
@@ -1,37 +0,0 @@
1
- module Console1984::Supervisor::Protector
2
- extend ActiveSupport::Concern
3
-
4
- private
5
- def extend_protected_systems
6
- extend_irb
7
- extend_active_record
8
- extend_socket_classes
9
- end
10
-
11
- def extend_irb
12
- IRB::Context.prepend(Console1984::ProtectedContext)
13
- Rails::ConsoleMethods.include(Console1984::Commands)
14
- end
15
-
16
- ACTIVE_RECORD_CONNECTION_ADAPTERS = %w[ActiveRecord::ConnectionAdapters::Mysql2Adapter ActiveRecord::ConnectionAdapters::PostgreSQLAdapter ActiveRecord::ConnectionAdapters::SQLite3Adapter]
17
-
18
- def extend_active_record
19
- ACTIVE_RECORD_CONNECTION_ADAPTERS.each do |class_string|
20
- if Object.const_defined?(class_string)
21
- klass = class_string.constantize
22
- klass.prepend(Console1984::ProtectedAuditableTables)
23
- end
24
- end
25
- end
26
-
27
- def extend_socket_classes
28
- socket_classes = [TCPSocket, OpenSSL::SSL::SSLSocket]
29
- if defined?(Redis::Connection)
30
- socket_classes.push(*[Redis::Connection::TCPSocket, Redis::Connection::SSLSocket])
31
- end
32
-
33
- socket_classes.compact.each do |socket_klass|
34
- socket_klass.prepend Console1984::ProtectedTcpSocket
35
- end
36
- end
37
- end