Backend: Disable expansion of file type variables when referenced in gitlab-ci.yml variables section
Status update (2022-10-19)
- We have a MR ready to ship. When shipped (target 15.7), job variable expansion will be changed and handled as expected for variables of type = file. In summary, going forward, variables that reference/alias file variables are expanded to the file variable's file name/path instead of its value (i.e., the file's content).
This is a breaking change but does resolve a potential security issue as secrets may be leaked with the current bug.
-
The plan is to simply ship the MR with the fix. There is no option as mentioned in some of the threads below, for shipping this fix behind a feature flag, providing a warning to the users.
-
I will keep the option open to pull the ship date into 15.6, as there are solid reasons, as outlined below, to do so. But I do want to give other users and customers that have not been following this issue the opportunity to be made aware of this change as there is a likelihood that the fix does, in fact impact a current workflow. Add comments to the new comment thread below. @DarrenEastman
Link to before and after.
Summary
When using file variables in the "variables" section of a job in .gitlab-ci.yml the contents are being written to the new variable.
Steps to reproduce
The following gitlab-ci.yml
.deployment:
image: alpine:latest
script:
- kubectl config set-cluster ${KUBE_CLUSTER} --server=${KUBE_SERVER} --certificate-authority="${KUBE_CA}"
"Deploy to stage":
extends: .deployment
stage: deploy:stage
when: manual
variables:
KUBE_CA: $KUBE_CA_STAGE
"Deploy to prod":
extends: .deployment
stage: deploy:prod
when: manual
variables:
KUBE_CA: $KUBE_CA_PROD
The variable KUBE_CA_PROD / KUBE_CA_STAGE are file variables in Gitlab. When using the variable KUBE_CA the contents are no longer a path to a file but the content of the file.
What is the current bug behavior?
Contents of file variables are written to variables
What is the expected correct behavior?
Path of file variable is used as variable
Results of GitLab environment info
Expand for output related to GitLab environment info
System information System: Ubuntu 18.04 Proxy: no Current User: git Using RVM: no Ruby Version: 2.5.3p105 Gem Version: 2.7.9 Bundler Version:1.17.3 Rake Version: 12.3.2 Redis Version: 3.2.12 Git Version: 2.21.0 Sidekiq Version:5.2.7 Go Version: unknown
GitLab information Version: 11.11.2-ee Revision: cfdecb7c5de Directory: /opt/gitlab/embedded/service/gitlab-rails DB Adapter: PostgreSQL DB Version: 9.6.11 URL: https://gitlab.XXXXX.com HTTP Clone URL: https://gitlab.XXXXX.com/some-group/some-project.git SSH Clone URL: git@gitlab.XXXXX.com:some-group/some-project.git Elasticsearch: no Geo: no Using LDAP: yes Using Omniauth: yes Omniauth Providers:
GitLab Shell Version: 9.1.0 Repository storage paths:
- default: /var/opt/gitlab/git-data/repositories GitLab Shell path: /opt/gitlab/embedded/service/gitlab-shell Git: /opt/gitlab/embedded/bin/git
Results of GitLab application Check
Expand for output related to the GitLab application check
not relevant
Proposal
Step | Status |
---|---|
1. GitLab: Stop expanding file variables when sending to Runner | #365859 (closed) |
2. Runner: Refactor the creation of the job temporary file path | gitlab-runner#29128 (closed) |
3. Fix file variables in Runner |
|
Technical
Note
TODO: Update the docs in !75477 (merged) when this issue is closed.
Solution
Once gitlab-runner!3613 (merged) is merged, file variables and variables the reference file variables will work as follows:
Having created a file variable via the GitLab UI named A_FILE_VAR
with content this is some super secret content
, the following job definition:
work:
stage: test
variables:
REF_FILE_VAR: $A_FILE_VAR
script:
- echo $A_FILE_VAR
- cat $A_FILE_VAR
- echo $REF_FILE_VAR
- cat $REF_FILE_VAR
will result in the following before and after outputs:
Before
$ echo $A_FILE_VAR
/builds/avonbertoldi/test-project.tmp/A_FILE_VAR
$ cat $A_FILE_VAR
this is some super secret content
$ echo $REF_FILE_VAR
this is some super secret content
$ cat $REF_FILE_VAR
cat: can't open 'this': No such file or directory
cat: can't open 'is': No such file or directory
cat: can't open 'some': No such file or directory
cat: can't open 'super': No such file or directory
cat: can't open 'secret': No such file or directory
cat: can't open 'content': No such file or directory
After
$ echo $A_FILE_VAR
/builds/avonbertoldi/test-project.tmp/A_FILE_VAR
$ cat $A_FILE_VAR
this is some super secret content
$ echo $REF_FILE_VAR
/builds/avonbertoldi/test-project.tmp/A_FILE_VAR
$ cat $REF_FILE_VAR
this is some super secret content