Skip to content

fix(cron): sanitize invisible unicode in assembled prompts - #25002

Closed
kimireg wants to merge 1 commit into
NousResearch:mainfrom
kimireg:fix/cron-sanitize-invisible-unicode
Closed

fix(cron): sanitize invisible unicode in assembled prompts#25002
kimireg wants to merge 1 commit into
NousResearch:mainfrom
kimireg:fix/cron-sanitize-invisible-unicode

Conversation

@kimireg

@kimireg kimireg commented May 13, 2026

Copy link
Copy Markdown

Summary

  • Strip Unicode format-control characters from assembled cron prompts before scanning/execution
  • Keep prompt-injection scanning effective by sanitizing before pattern checks
  • Add regression coverage for zero-width/invisible Unicode and emoji ZWJ script output

Test plan

  • python -m pytest tests/cron/test_cron_prompt_injection_skill.py
  • python -m py_compile cron/scheduler.py tools/cronjob_tools.py tests/cron/test_cron_prompt_injection_skill.py
  • git diff --check
  • python -m pytest tests/cron

Strip Unicode format-control characters from cron prompts before scanning and execution. This prevents benign external content such as emoji joiners in script output from blocking scheduled jobs, while still exposing hidden prompt-injection text to the scanner.
@alt-glitch alt-glitch added type/security Security vulnerability or hardening P2 Medium — degraded but workaround exists comp/cron Cron scheduler and job management labels May 13, 2026
@teknium1

Copy link
Copy Markdown
Contributor

This has been implemented on current main by a later maintainer fix. This is an automated hermes-sweeper review.

Evidence:

  • PR fix(cron): sanitize invisible unicode in vetted skill content instead of hard-blocking #37245 merged the cron invisible-unicode fix as 2c0d64839783c98301a6ebaead5adc51e05c0cad.
  • tools/cronjob_tools.py:184 defines _strip_invisible_unicode(), preserving legitimate emoji ZWJ sequences while removing invisible controls from assembled/vetted content.
  • tools/cronjob_tools.py:235 applies that sanitizer before the assembled cron prompt injection scan.
  • cron/scheduler.py:1280 uses the cleaned assembled prompt for cron jobs with skills or injected runtime data, so sanitized text is what proceeds to execution.
  • Regression coverage in tests/tools/test_cronjob_tools.py:123 and tests/tools/test_cronjob_tools.py:143 verifies invisible Unicode is stripped without allowing hidden prompt injection through.
  • The fix is contained in release tag v2026.6.5.

One intentional difference from this PR: current main keeps raw user-authored cron prompts strict-blocking on invisible Unicode, and only sanitizes vetted/runtime-loaded assembled content. That preserves the security posture while fixing the false-positive cron failure mode.

@teknium1 teknium1 closed this Jun 12, 2026
@teknium1 teknium1 added the sweeper:implemented-on-main Sweeper: behavior already present on current main label Jun 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

comp/cron Cron scheduler and job management P2 Medium — degraded but workaround exists sweeper:implemented-on-main Sweeper: behavior already present on current main type/security Security vulnerability or hardening

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants