Sha256: 9c574f42f996f5b4f6215be61f72e2097d36f12c54aeee40007e78ecd59563d9

Contents?: true

Size: 1.11 KB

Versions: 2

Compression:

Stored size: 1.11 KB

Contents

# frozen_string_literal: true

module TaintedLove
  module Replacer
    class ReplaceKernel < Base
      def replace!
        %i[eval system `].each do |method|
          TaintedLove.proxy_method(Kernel, method) do |_, *args|
            TaintedLove.report(
              :ReplaceKernel,
              args.first,
              [:rce],
              "Kernel##{method} execution using tainted input"
            ) if args.first&.tainted?
          end
        end

        Kernel.class_eval do
          alias_method :_tainted_love_original_open, :open

          def open(*args, &block)
            first = args.first
            return_value = _tainted_love_original_open(*args, &block)

            if first.tainted?
              return_value.taint

              TaintedLove.report(
                :ReplaceKernel,
                first,
                [:rce],
                'Kernel#open begins with "|" and uses tainted input'
              ) if first.is_a?(String) && first[0] == '|'
            else
              return_value.untaint
            end

            return_value
          end
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
tainted_love-0.4.1 lib/tainted_love/replacer/replace_kernel.rb
tainted_love-0.4.0 lib/tainted_love/replacer/replace_kernel.rb