vergëft-pipeline-Ausféierung-II

En Deep Dive an CI/CD PipelineSchwachstelle (II): Indirekt Vergëftung Pipeline Ausféierung (I-PPE)

An eisem viregten Artikel, Mir hunn gesinn, wéi een direkt Vergëftung erkennt a sech dovunner schützt Pipeline Ausféierung (D-PPE). Mir hunn och gesinn, wéi een dës Schwachstelle mat Hëllef vun Xygeni Scanner, souwéi e puer Schutzmechanismen. 

 Gëft gemaach Pipeline Ausféierung (PPE) gëtt produzéiert wann den Ugräifer d'Ännerunge maache kann pipeline Logik op zwou Aarte:

  • Duerch d'Ännere vun der CI-Konfiguratiounsdatei (den pipeline) -> Direkt PSA (D-PPA)
  • Duerch d'Ännere vu Fichieren, op déi vun der pipeline (zum Beispill: Skripter, op déi aus dem Inhalt referenzéiert gëtt) pipeline Konfiguratiounsdatei) -> Indirekt PSA (I-PPE)
pp2

An dësem Beitrag wäerte mir eis méi genau mat indirekter perséinlecher Schutzausrüstung beschäftegen. Mee virdrun, an als Ergänzung zu mengem viregten Beitrag, kucke mer eis als éischt un, wéi GitHub d'Ausféierung vun ... geréiert. pipelines a wat sinn d'Schutzmechanismen géint D-PPE.

Wéi schützt GitHub d'Ausféierung vun pipelineKënnt dat vu PRs?

Wéi funktionéiert GitHub wat d'Ausféierung vu modifizéierten pipelines?

geännert pipelines kënne vu Pushes oder Pull Requests (PR) an. Als wichteg Best Practice ass et staark recommandéiert, all direkten "Push" op eng geschützt Branche ze vermeiden an ... ze benotzen Pull Requests als Mechanismus fir eng gewëssen Iwwerpréiwung ze erzwingen, ier iergendeen bäigedroene Code akzeptéiert gëtt. 

Pull Requests kann aus zwou verschiddene Quelle kommen:

  • PRs kommen vun forcéiert ginn
  • PRs kommen vun Agence

PRs vun forcéiert ginn kann entweder vun ëffentlechen or private Dépôten.

Well mir et mat PPE (Vergëftungsausrüstung) ze dinn hunn Pipeline Ausféierung), eisen Haaptpunkt ass net d'"Akzeptanz" vun engem PR, mä d'Ausféierung vun engem modifizéierten pipeline wärend dem Akzeptanz-/Genehmegungsprozess vum PR. Am Kär vun engem PPE-Ugrëff ass eng ongewollt Ausféierung vun engem "béiswëllegen" modifizéierten pipeline. 

An e puer Wierder, Vergëft Pipeline Ausféierung (PPE) gëtt produzéiert wann den Ugräifer kann änneren pipeline Logik.

Et ginn zwou Varianten:

  • Direkt PSA (D-PSA): An engem D-PPE Szenario, Den Ugräifer ännert d'CI-Konfiguratiounsdatei an engem Repository, op dat se Zougang hunn, entweder andeems se d'Ännerung direkt op eng ongeschützt Remote Branch um Repo pushen, oder andeems se eng PR mat der Ännerung vun enger Branch oder enger Fork ofginn. Zënter dem CI pipeline D'Ausféierung gëtt duerch d'Kommandoen an der modifizéierter CI-Konfiguratiounsdatei definéiert, déi béiswëlleg Kommandoen vum Ugräifer lafen schlussendlech am Build-Knuet aus, soubal de Build fäerdeg ass. pipeline ausgeléist gëtt.
  • Indirekt PSA (I-PSA): A bestëmmte Fäll ass d'Méiglechkeet vun D-PPE net fir e Géigner verfügbar, deen Zougang zu engem SCM Repository (z.B. wann de pipeline ass konfiguréiert fir d'CI-Konfiguratiounsdatei vun enger separater, geschützter Branche am selwechte Repository ze kréien). An esou engem Szenario, anstatt ze vergëften, pipeline selwer, en Ugräifer sprëtzt béiswëlleg Code an Dateien, op déi vum pipeline (zum Beispill: Skripter, op déi aus dem Inhalt referenzéiert gëtt) pipeline Konfiguratiounsdatei)

A béide Fäll, GitHub wäert déi geännert Datei ausféieren pipeline ouni datt eng virdrun Iwwerpréiwung oder Genehmegung néideg ass.

PRs vun de Gabelen un ëffentlechen Rescht

GitHub erlaabt d'Konfiguratioun vum Verhalen bei der Veraarbechtung PRs, déi vu Forken an ëffentleche Repos kommen.

Wann e PR vun enger Fork kënnt, forcéiert GitHub ëmmer e gewësse Grad vun "Zoustëmmung", ier en ausgefouert gëtt. pipeline am Zesummenhang mat der PRDësen Niveau vun Zoustëmmung wiesselt vun enger schwaacher zu enger strikter Zoustëmmung.

At Organisatiounsniveau (Org>>Astellungen>>Aktiounen>>Allgemeng), kënnt Dir tëscht verschiddenen "Genehmegungs"-Optiounen wielen:

ppe3

Déi strengst ass déi lescht ("D'Zoustëmmung vun allen externen Zesummenaarbechter verlaangen”) well GitHub ëmmer eng Genehmegung verlaangt, wann d'PR vu Forks vun externen Zesummenaarbechter kënnt. 

Mä och an dësem strikte Fall gëtt et Ënnerscheeder tëscht Mataarbechter mat Lies- a Schreifrechter.

  • Wann d'PR vun engem kënnt gelies Benotzer, den Ausféierung vun der pipeline ass GESTOPPT bis d'Ännerunge guttgeheescht goufen. Wann d'Genehmegung ok ass, dann déi geännert pipeline gëtt higeriicht. 
  • Wann d'PR vun engem kënnt schreiwen Benotzer, den Genehmegung ass net néideg an déi geännert pipeline gëtt ëmmer ëmgesat!! 
pp4

Als Schlussfolgerung sinn PRs, déi vu Forks op ëffentleche Repositories kommen, liicht géint PPE geschützt. Et gëtt e gewësse Schutz géint extern (Lies-) Benotzer, awer näischt wat intern (Schreif-) Benotzer ugeet.

Wouriwwer PRs, déi vu Forken aus private Repos kommen?

PRs vun de Gabelen un private Rescht

An dësem Szenario bitt GitHub e puer nëtzlech Konfiguratiounsastellungen.

ppe9

Déi uewe genannten Astellunge kënnen entweder op Uergel oder at repo Niveau.

Wéini keng Optioun ass ugeklickt, GitHub wäert froen fir Genehmegung an et wäert déi geännert net ausféieren pipelineDëst ass déi sécherst Konfiguratioun!!

d' onsécherst Konfiguratioun ass wann "Workflows vun enger Fork aus ausféieren pull request„ass iwwerpréiftAn dësem Fall, datselwecht fir Lies- a Schreifbenutzer, wäert Github automatesch déi geännert Funktioun ausféieren. pipeline!! An dës Situatioun kann nach méi verschlechtert wann"Schreiftoken vun der Fork un d'Workflows schécken pull requests"A"Geheimnisser a Variabelen vun der Fork un d'Workflows schécken pull requests„ sinn ugekräizt. Maacht dat net, ausser et ass kloer gerechtfäerdegt!!

Wann “Genehmegung fir Gabel erfuerderlech pull request workflows„ ass ugeklickt, gëtt déi uewe genannte Situatioun e bësse verbessert: GitHub freet ëm Genehmegung an ausféiert déi geännert Versioun net. pipeline fir de Liesbenotzer, awer et wäert et ëmmer nach fir e Schreifbenotzer ausféieren.

ppe6

Gabelen gesinn, wat ass mat PRs aus Filialen?

PRs vun Agence

Fir dëst Szenario ze schützen, musst Dir Iech drop verloossen Reegele fir de Schutz vun der Filial

Op Repository-Niveau kënnt Dir Branch-Schutzregelen fir all Branch erstellen. Dës Regele addéieren e puer Restriktioune fir d'Modifikatioun vu geschützte Branchen.

Och wann Dir eng Regel konfiguréiert fir "Verlaangt a pull request virun der Fusioun"A"Genehmegungen erfuerderen", déi modifizéiert pipeline gëtt automatesch beim Erstelle vun engem PR ausgeführtD'„Genehmegung“ gëllt nëmme fir d'Fusiounsaktioun.

ppe7

Wat mat indirekter Vergëftung? Pipeline Ausféierung

Wéi mir uewe gesinn hunn, kann D-PPE mat Hëllef vun pull_request_target, awer et gëllt net fir I-PSA.

Wann Dir pull_request_target benotzt, ass den Standard-Checkout de Basiscode. Wann Dir awer e puer Kontrollen um bäigedroene Code (PR-Code) validéiere wëllt, musst Dir de PR-Code explizit auschecken. Dofir, wann de PR-Code e Shellskript geännert huet, dat vum ... opgeruff gouf pipeline, d'„Basis“ (sécher) pipeline wäert de "modifizéierten" Shellskript opruffen → Indirekt PPE!!

D'Léisung dofir ass e bësse méi komplizéiert (et gëtt kee magesche Mëttel wéi pull_request_target). 

eis pipeline ass elo sécher fir D-PPE well mir pull_request_target benotzen. Mee et ass ëmmer nach vulnérabel fir I-PPE. 

An eisem Testbeispill musse mir de PR-Code grondsätzlech ausprobéieren, fir de Build ze maachen, awer d'Tester ginn op dem Artefakt ausgefouert, deen vum Build generéiert gëtt. 

Also .. Firwat kuckt Dir net béid Codebasen? 

  • De PR-Code vum Checkout aus, well et de bäigefügte Code ass, deen mir wëlle bauen an testen.
  • Checkout Basiscode fir déi original Versioun vum Programm auszeféieren pipeline an d'Build/Test-Skripter 

Dëst kéint gemaach ginn duerch dës Codebasen an ënnerschiddlech Ordner auscheckenDe Basiscode kéint am Root-Ordner ausgecheckt ginn, an de PR an engem aneren Dossier. An dësem Fall géife mir de Build an den Testskript vum Root-Ordner géint de Code ausféieren, deen an den neien Dossier placéiert ass.

Dëst ass natierlech eng einfach Léisung!! Mee, fir Léierzwecker géif ech gären eng zimlech interessant Variant aféieren (...) 

GitHub workflow_run Ausléiser-Evenement

Nieft pull_request_target, GitHub bitt en aneren Trigger-Event un: workflow_runDëst Evenement erlaabt Ausféierung vun engem pipeline konditionéiert op eng aner pipelined'Ausféierung

workflow_run an pull_request_target Ausléiser sinn an engem Aspekt ähnlech: béid ginn am privilegéierte Modus ausgefouert an, trotz de PR-Ännerungen, d'Basis pipeline gëtt higeriicht!! 

Loosst eis eis aktuell kucken pipeline:

D'Baupartie ass sécher fir D-PPE, awer d'Testpartie ass nach ëmmer ufälleg fir I-PPE.

d' pipeline selwer ass sécher fir D-PPE wéinst dem pull_request_target ausléisen. Mä den Testschrëtt ass ëmmer nach vulnérabel fir I-PPE wéinst dem Opruff vun engem externen Shellskript.

Vermeiden vun I-PSA 

Den Zweck vun der uewen pipeline ass de bäigedroe Code ze bauen an ze testen, andeems se sécher fir perséinlech Schutzausrüstung ass. 

Also .. Firwat net opdeelen pipeline an zwee? Een fir ze bauen an een aneren fir ze testen..

  • Déi 1. pipeline (CI bauen) géif Kuckt de PR-Code (fir en ze bauen), maacht de Build a generéiert en Artefakt.
  • De 2ten pipeline (Test-CI) géif Kuckt de Basiscode (fir Ännerungen am Shell-Skript ze vermeiden). an déi originell Skripter géint den Artefakt ausféieren. 
  • Fir den Test-CI ze synchroniséieren pipeline fir NO dem Build CI auszeféieren pipeline, mir wäerten de benotzen workflow_run ausléisen. 
ppe8

Op dës Manéier:

  • pipeline CI bauen is sécher zu deenen zwee D-PSA (wéinst pull_request_target) an I-PSA (well et de Shell-Skript net méi ausféiert).
  • pipeline Test-CI ass och sécher zu deenen zwee D-PSA (wéinst workflow_run) an I-PSA (well et de Basiscode iwwerpréift fir den originelle Shell-Skript ze kréien) 

Kucke mer eis de Code vun deenen zwee un pipelines no dësen Modifikatiounen …

1st pipeline (Build-CI):

2nd pipeline (Test-CI):

Wow… schéin Léisung!! Mee ….. Sinn mir sécher? Ech fäerten, datt net 😭

Tatsächlech hu mir eng nei Schwachstelle virgestallt!! Wéi eng? Dat ass den Thema vun eisem nächste Post 🙂 … Bleift drun!! 

PS: Entschëllegt, ech kann net roueg bleiwen 🤐 ..Hutt Dir schonn dovunner héieren Artefaktvergëftung ? 😂

Artefaktvergëftung a Code-Injektioun

En Deep Dive an CI/CD PipelineSchwachstelle (III)

Schutz géint Artefaktvergëftung duerch Software-Attestatiounen

En Deep Dive an CI/CD PipelineSchwachstelle (IV)

Gëft gemaach Pipeline Ausféierung (PPE)

En Deep Dive an CI/CD PipelineSchwachstelle (I)
sca-tools-software-zesummesetzungsanalyse-tools
Prioritäriséiert, behënnert a séchert Är Softwarerisiken
Kritt Äre gratis Kont.
Kee Kreditkaart erfuerderlech.

Séchert Är Softwareentwécklung a Liwwerung

mat der Xygeni Produkt Suite