From 1d20ba915f10e46417d07c4ddf6d9a9d6ea40e7b Mon Sep 17 00:00:00 2001 From: Aditya Chhabra Date: Wed, 5 Nov 2025 19:25:12 +0530 Subject: [PATCH 1/2] security: fix template injection vulnerabilities in template rendering. --- src/cleveragents/templates/inline_jinja_handler.py | 6 ++++-- src/cleveragents/templates/inline_yaml_jinja.py | 7 ++++--- src/cleveragents/templates/jinja_yaml_preprocessor.py | 6 ++++-- src/cleveragents/templates/yaml_jinja_loader.py | 6 ++++-- src/cleveragents/templates/yaml_preprocessor.py | 8 ++++++-- src/cleveragents/templates/yaml_template_engine.py | 10 +++++----- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/cleveragents/templates/inline_jinja_handler.py b/src/cleveragents/templates/inline_jinja_handler.py index 95e01299e..670c203a1 100644 --- a/src/cleveragents/templates/inline_jinja_handler.py +++ b/src/cleveragents/templates/inline_jinja_handler.py @@ -14,7 +14,7 @@ from typing import List from typing import Optional import yaml -from jinja2 import Environment +from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) @@ -32,7 +32,8 @@ class InlineJinjaHandler: """ def __init__(self) -> None: - self.env = Environment( + # Security: Use SandboxedEnvironment to prevent code execution + self.env = SandboxedEnvironment( block_start_string="{%", block_end_string="%}", variable_start_string="{{", @@ -41,6 +42,7 @@ class InlineJinjaHandler: comment_end_string="#}", trim_blocks=True, lstrip_blocks=True, + autoescape=False, ) def process_yaml_file( diff --git a/src/cleveragents/templates/inline_yaml_jinja.py b/src/cleveragents/templates/inline_yaml_jinja.py index 6486970a8..20fa7b517 100644 --- a/src/cleveragents/templates/inline_yaml_jinja.py +++ b/src/cleveragents/templates/inline_yaml_jinja.py @@ -14,7 +14,7 @@ from typing import List from typing import Optional import yaml -from jinja2 import Environment +from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) @@ -31,14 +31,15 @@ class InlineYAMLJinja: """ def __init__(self) -> None: - # Configure Jinja2 to work well with YAML - self.env = Environment( + # Use SandboxedEnvironment to prevent code execution + self.env = SandboxedEnvironment( block_start_string="{%", block_end_string="%}", variable_start_string="{{", variable_end_string="}}", comment_start_string="{#", comment_end_string="#}", + autoescape=False, ) # Add useful filters diff --git a/src/cleveragents/templates/jinja_yaml_preprocessor.py b/src/cleveragents/templates/jinja_yaml_preprocessor.py index 61a7141bf..98feba8b6 100644 --- a/src/cleveragents/templates/jinja_yaml_preprocessor.py +++ b/src/cleveragents/templates/jinja_yaml_preprocessor.py @@ -13,7 +13,7 @@ from typing import List from typing import Optional import yaml -from jinja2 import Environment +from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) @@ -30,7 +30,8 @@ class JinjaYAMLPreprocessor: """ def __init__(self) -> None: - self.env = Environment( + # Use SandboxedEnvironment to prevent code execution + self.env = SandboxedEnvironment( block_start_string="{%", block_end_string="%}", variable_start_string="{{", @@ -39,6 +40,7 @@ class JinjaYAMLPreprocessor: comment_end_string="#}", trim_blocks=True, lstrip_blocks=True, + autoescape=False, ) def load_file( diff --git a/src/cleveragents/templates/yaml_jinja_loader.py b/src/cleveragents/templates/yaml_jinja_loader.py index 53a490034..ebefbcc83 100644 --- a/src/cleveragents/templates/yaml_jinja_loader.py +++ b/src/cleveragents/templates/yaml_jinja_loader.py @@ -13,7 +13,7 @@ from typing import Optional from typing import Tuple import yaml -from jinja2 import Environment +from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) @@ -27,7 +27,8 @@ class YAMLJinjaLoader: """ def __init__(self) -> None: - self.env = Environment( + #Use SandboxedEnvironment to prevent code execution + self.env = SandboxedEnvironment( block_start_string="{%", block_end_string="%}", variable_start_string="{{", @@ -36,6 +37,7 @@ class YAMLJinjaLoader: comment_end_string="#}", trim_blocks=True, lstrip_blocks=True, + autoescape=False, ) def load_file( diff --git a/src/cleveragents/templates/yaml_preprocessor.py b/src/cleveragents/templates/yaml_preprocessor.py index 10eae051b..994706d32 100644 --- a/src/cleveragents/templates/yaml_preprocessor.py +++ b/src/cleveragents/templates/yaml_preprocessor.py @@ -12,8 +12,8 @@ from typing import Any from typing import Optional import yaml -from jinja2 import Environment from jinja2 import meta +from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) @@ -26,8 +26,11 @@ class YAMLTemplateProcessor: and filters within YAML files by using a two-phase approach. """ + from jinja2.sandbox import SandboxedEnvironment + def __init__(self) -> None: - self.env = Environment( + #Use SandboxedEnvironment to prevent code execution + self.env = SandboxedEnvironment( block_start_string="{%", block_end_string="%}", variable_start_string="{{", @@ -36,6 +39,7 @@ class YAMLTemplateProcessor: comment_end_string="#}", trim_blocks=True, lstrip_blocks=True, + autoescape=False, ) def process_file(self, file_path: Path, context: dict[str, Any]) -> dict[str, Any]: diff --git a/src/cleveragents/templates/yaml_template_engine.py b/src/cleveragents/templates/yaml_template_engine.py index 3ea2cf225..dc3601874 100644 --- a/src/cleveragents/templates/yaml_template_engine.py +++ b/src/cleveragents/templates/yaml_template_engine.py @@ -14,7 +14,7 @@ from typing import Optional from typing import Tuple import yaml -from jinja2 import Environment +from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) @@ -31,17 +31,17 @@ class YAMLTemplateEngine: """ def __init__(self) -> None: - # Configure Jinja2 for YAML-friendly output - self.env = Environment( + self.env = SandboxedEnvironment( block_start_string="{%", block_end_string="%}", variable_start_string="{{", variable_end_string="}}", comment_start_string="{#", comment_end_string="#}", - trim_blocks=False, # Don't trim to preserve structure - lstrip_blocks=False, # Don't strip to preserve indentation + trim_blocks=False, + lstrip_blocks=False, keep_trailing_newline=True, + autoescape=False, ) # Add custom filters for YAML -- 2.52.0 From 7c762c4d2d13411162914de2736d2d556aee9e51 Mon Sep 17 00:00:00 2001 From: Aditya Chhabra Date: Fri, 14 Nov 2025 20:13:57 +0530 Subject: [PATCH 2/2] fix: fix a minor pylint issue --- src/cleveragents/templates/yaml_preprocessor.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cleveragents/templates/yaml_preprocessor.py b/src/cleveragents/templates/yaml_preprocessor.py index 994706d32..3a44ee8f9 100644 --- a/src/cleveragents/templates/yaml_preprocessor.py +++ b/src/cleveragents/templates/yaml_preprocessor.py @@ -26,8 +26,6 @@ class YAMLTemplateProcessor: and filters within YAML files by using a two-phase approach. """ - from jinja2.sandbox import SandboxedEnvironment - def __init__(self) -> None: #Use SandboxedEnvironment to prevent code execution self.env = SandboxedEnvironment( -- 2.52.0