1
00:00:00,329 --> 00:00:04,560
So, I- I was hacking away on a custom
git-hook plugin for Claude Code last night in

2
00:00:04,613 --> 00:00:06,080
my shed, right?

3
00:00:06,120 --> 00:00:09,920
And I- I nearly gave myself a massive
heart attack because my local build just

4
00:00:09,964 --> 00:00:11,360
completely refused to run.

5
00:00:11,680 --> 00:00:14,000
I'm talking flat-out dead in the water.

6
00:00:14,107 --> 00:00:20,240
Turns out, version 2.1.207 dropped, and it
absolutely guts how we process user

7
00:00:20,304 --> 00:00:21,280
configurations.

8
00:00:21,387 --> 00:00:24,080
It's a massive breaking change, fair
dinkum.

9
00:00:24,882 --> 00:00:29,322
Oh yeah, the 2.1.207 release is huge,
Lachlan!

10
00:00:29,482 --> 00:00:32,762
It completely deprecates raw template
strings in custom hooks.

11
00:00:32,882 --> 00:00:33,322
Why?

12
00:00:33,422 --> 00:00:36,122
Because of shell-injection
vulnerabilities.

13
00:00:36,255 --> 00:00:40,442
If you are concatenating user inputs
directly into a shell command inside your

14
00:00:40,488 --> 00:00:44,682
plugin manifest, an attacker could inject
arbitrary commands-like,

15
00:00:44,735 --> 00:00:49,082
uh, rm -rf-just by manipulating a
configuration option.

16
00:00:49,242 --> 00:00:53,802
The tool is brought to you by Jellypod AI,
by the way, but seriously,

17
00:00:53,834 --> 00:00:58,442
this security fix is a massive deal for
anyone building Claude Code extensions.

18
00:00:58,862 --> 00:01:02,969
Right, so it's like putting raw user input
straight into a SQL query without

19
00:01:03,031 --> 00:01:04,089
escaping it.

20
00:01:04,169 --> 00:01:05,769
You're just asking for trouble.

21
00:01:06,049 --> 00:01:09,129
A real, uh, snake in the grass scenario.

22
00:01:09,289 --> 00:01:13,849
So if the raw template strings are out,
how do we actually pass those config options

23
00:01:13,909 --> 00:01:16,489
now without leaving the back door wide
open?

24
00:01:16,953 --> 00:01:18,410
You have two secure paths now.

25
00:01:18,570 --> 00:01:23,530
First, you can migrate to structured,
exec-form arrays in your JSON manifests.

26
00:01:23,630 --> 00:01:29,439
Instead of writing a single string like
"command": "echo $USER_INPUT",

27
00:01:29,564 --> 00:01:34,090
you have to define it as an array of
arguments, like ["echo",

28
00:01:34,250 --> 00:01:35,050
"user_input"].

29
00:01:35,070 --> 00:01:39,137
This bypasses the shell interpreter
entirely, so the arguments are passed directly

30
00:01:39,195 --> 00:01:40,737
to the executable.

31
00:01:40,803 --> 00:01:43,610
No shell evaluation, no injection vector.

32
00:01:43,610 --> 00:01:43,610
It's clean.

33
00:01:44,184 --> 00:01:47,128
Okay, so the exec-form array is the gold
standard.

34
00:01:47,308 --> 00:01:50,408
But what if we actually need those env
vars?

35
00:01:50,504 --> 00:01:51,768
What's the go there?

36
00:01:52,216 --> 00:01:53,122
That's the second path.

37
00:01:53,213 --> 00:01:57,762
Claude Code now automatically exports your
plugin configuration options as

38
00:01:57,809 --> 00:02:01,522
environment variables prefixed with
CLAUDE_PLUGIN_OPTION_.

39
00:02:01,962 --> 00:02:07,122
So if you have a config option named
api_key, it's exposed in the execution

40
00:02:07,169 --> 00:02:10,642
environment as
CLAUDE_PLUGIN_OPTION_API_KEY.

41
00:02:10,762 --> 00:02:13,602
You just read it directly from the
environment inside your script.

42
00:02:13,762 --> 00:02:17,842
It's completely sandboxed and safe from
shell parsing exploits.

43
00:02:18,347 --> 00:02:19,740
Right, that makes heaps of sense.

44
00:02:19,847 --> 00:02:23,500
So you're not stitching strings together
like a bad patchwork quilt.

45
00:02:23,620 --> 00:02:26,780
But wait, there was something else in the
release notes that caught my eye.

46
00:02:26,860 --> 00:02:30,180
They're changing how the tool looks up
these configuration files,

47
00:02:30,204 --> 00:02:30,460
yeah?

48
00:02:30,524 --> 00:02:33,660
Something about local repository settings
being ignored?

49
00:02:34,212 --> 00:02:35,332
Yes, exactly.

50
00:02:35,385 --> 00:02:40,932
To prevent a malicious repository from
committing a rogue .clauderc or local config

51
00:02:40,996 --> 00:02:45,972
file that automatically runs exploit
payloads when a developer opens the project,

52
00:02:46,006 --> 00:02:50,932
Claude Code now ignores local repository
settings files for plugin configuration

53
00:02:50,990 --> 00:02:51,652
resolution.

54
00:02:51,812 --> 00:02:56,772
It forces the resolution to happen at the
global user level or via explicitly passed

55
00:02:56,805 --> 00:02:58,212
environment configurations.

56
00:02:58,399 --> 00:03:02,212
It stops drive-by attacks on developers
cloning untrusted repos.

57
00:03:02,715 --> 00:03:04,747
Well, that's a massive win for peace of
mind.

58
00:03:04,873 --> 00:03:09,307
Though I'll admit, while they were busy
tightening the security screws,

59
00:03:09,355 --> 00:03:12,347
they did throw in some nice
quality-of-life updates.

60
00:03:12,487 --> 00:03:17,307
The autocomplete for /cd in the terminal
is finally working,

61
00:03:17,327 --> 00:03:22,107
and they added credential timeout guards
for AWS Bedrock, which is handy if your

62
00:03:22,147 --> 00:03:24,187
session tokens keep dying mid-run.

63
00:03:24,978 --> 00:03:29,043
Absolutely, the Bedrock timeout guard
prevents the CLI from hanging indefinitely

64
00:03:29,075 --> 00:03:31,523
when your AWS STS tokens expire.

65
00:03:31,683 --> 00:03:33,604
It's a solid, robust release.

66
00:03:33,763 --> 00:03:38,323
If you're building plugins, migrate those
manifests to exec-form arrays or start

67
00:03:38,363 --> 00:03:41,923
reading CLAUDE_PLUGIN_OPTION_ env vars
right away.

