foxguard 0.12.0

A security scanner as fast as a linter, written in Rust. 200+ built-in rules across 12 source languages.
Documentation
import subprocess


def unknown_command(command):
    return subprocess.run(command)


def dynamic_executable(command):
    return subprocess.run([command], shell=False)


def argv(value) -> list[str]:
    return [value]


def misleading_typed_builder(user):
    return subprocess.run(argv(user))


def replaced_executable(user):
    args = ["tool", "--status"]
    args[0] = user
    return subprocess.run(args)


def cleared_argv(user):
    args = ["tool"]
    args.clear()
    args.append(user)
    return subprocess.run(args)


class Evil:
    def gdb_args(self, user):
        return user


def colliding_external_receiver(evil: Evil, user):
    return subprocess.run(evil.gdb_args(user))


class SafeProbe:
    def gdb_args(self, values: list[str]) -> list[str]:
        return ["gdb", *values]


def typed_scope(probe: SafeProbe):
    return probe.gdb_args([])


def cross_scope_receiver_collision(probe, user):
    return subprocess.run(probe.gdb_args(user))


def unrelated_safe_argv_scope():
    cross_scope_args = ["tool"]
    return cross_scope_args


def unrelated_argv_parameter(cross_scope_args):
    return subprocess.run(cross_scope_args)


def unrelated_constant_scope():
    cross_scope_command = "tool"
    return cross_scope_command


def unrelated_command_parameter(cross_scope_command):
    return subprocess.run(cross_scope_command)


def assignment_after_sink(args):
    subprocess.run(args)
    args = ["tool"]
    return args


def escaped_alias(user):
    args = ["tool"]
    alias = args
    alias.clear()
    args.append(user)
    return subprocess.run(args)


def escaped_unknown_mutator(user):
    args = ["tool"]
    mutate(args, user)
    return subprocess.run(args)


def untyped_builder(build, value):
    args = build(value)
    return subprocess.run(args, shell=False)


def shell_list(value):
    return subprocess.run(["tool", value], shell=True)


def dynamic_shell(value, use_shell):
    return subprocess.run(["tool", value], shell=use_shell)


def formatted_shell(value):
    return subprocess.run(f"tool {value}")


def concatenated_shell(value):
    return subprocess.run("tool " + value, shell=False)