Claude-Agent
view release on metacpan or search on metacpan
lib/Claude/Agent/MCP/SDKRunner.pm view on Meta::CPAN
# *** SECURITY WARNING ***
# TMPDIR is user-controllable and NOT validated for trust.
# KNOWN RISK: An attacker who can set TMPDIR before process startup
# could influence which socket paths are allowed, potentially enabling
# connections to attacker-controlled sockets.
#
# FOR HIGH-SECURITY DEPLOYMENTS: Set CLAUDE_AGENT_IGNORE_TMPDIR=1
#
# Additional mitigations:
# 1. Set CLAUDE_AGENT_IGNORE_TMPDIR=1 to ignore TMPDIR entirely (RECOMMENDED)
# 2. Validate socket ownership with stat() before connecting
# 3. Use only fixed prefixes by not setting TMPDIR
# 4. Run in a restricted environment where TMPDIR cannot be manipulated
# 5. Set TMPDIR to a trusted directory (e.g., /tmp) before process startup
# Only allow TMPDIR when explicitly enabled via CLAUDE_AGENT_ALLOW_TMPDIR=1
# This is opt-in for stricter security - TMPDIR could be attacker-controlled
# SECURITY WARNING: NEVER set CLAUDE_AGENT_ALLOW_TMPDIR=1 in untrusted environments
# or when an attacker could control environment variables before process startup.
# An attacker could set both CLAUDE_AGENT_ALLOW_TMPDIR=1 and a malicious TMPDIR
# to redirect socket connections to attacker-controlled locations.
if ($ENV{TMPDIR} && $ENV{TMPDIR} =~ m{^/} && $ENV{CLAUDE_AGENT_ALLOW_TMPDIR}) {
lib/Claude/Agent/MCP/SDKRunner.pm view on Meta::CPAN
die "Invalid tool definition: expected hash with 'name' key\n"
unless ref $tool eq 'HASH' && defined $tool->{name};
}
# Build tool lookup
my %tool_by_name = map { $_->{name} => $_ } @$tools;
# Validate socket ownership before connecting (defense-in-depth)
# This helps detect if an attacker has replaced the socket with one they control
{
my @stat_info = stat($socket_path);
if (@stat_info) {
my $socket_uid = $stat_info[4];
if ($socket_uid != $<) {
die "Security error: socket '$socket_path' is owned by uid $socket_uid, expected uid $< (current user)\n";
}
}
# If stat fails, the socket may not exist yet - let the connect() call handle it
}
# Connect to parent socket
( run in 1.749 second using v1.01-cache-2.11-cpan-39bf76dae61 )