Samin061 opened a new pull request, #70091:
URL: https://github.com/apache/airflow/pull/70091

   The POSIX builders in `remote_job.py` interpolate `RemoteJobPaths` values 
into single-quoted shell words without escaping, so a single quote anywhere in 
`remote_base_dir` closes the quote and the rest of the value is parsed as 
commands that run on the remote host as the SSH connection user. 
`remote_base_dir` is a template field, but `_validate_base_dir` runs in 
`__init__` against the un-rendered Jinja literal and never looks for shell 
metacharacters, so a value like `{{ dag_run.conf['dir'] }}` reaches the shell 
unchecked and someone who can only trigger a Dag run with config gets a shell 
on the target host. Quoting with `shlex.quote` at each site matches what the 
Windows builders already do via `ps_escape`.
   
   All six POSIX builders are affected. The `_validate_job_dir` prefix check on 
cleanup does not help, since a base dir that starts with 
`/tmp/airflow-ssh-jobs/` and then contains a quote still passes it:
   
   ```
   base_dir = "/tmp/airflow-ssh-jobs/x'; touch /tmp/pwned; :'"
   build_posix_cleanup_command(paths.job_dir)
   # rm -rf '/tmp/airflow-ssh-jobs/x'; touch /tmp/pwned; :'/job_123'
   ```
   
   Added a parametrized regression that runs each builder's output through `sh` 
and asserts the injected marker is never created; it fails on all six before 
this change.
   
   ---
   
   ##### Was generative AI tooling used to co-author this PR?
   
   - [X] Yes (please specify the tool below)
   
   Generated-by: Claude Code (Opus 4.8) following [the 
guidelines](https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#gen-ai-assisted-contributions)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to