Puncte:0

Cum pot obține o cale validă de la argument în scriptul #!/bin/sh?

drapel cn

Am ceva script (copie) și vreau să obțin o cale validă.

#!/bin/sh
cp -R $1 $2

Am incercat cu un astfel de parametru

./copy.sh /home/apple /home/pie;reporniți

apoi serverul a fost repornit și nu este acceptabil pe serverul de producție.

Știu că calea Linux este compusă numai cu [a-zA-Z0-9_-/. ]

Cum pot filtra $1 și $2, astfel încât să pot suna fără griji.

#!/bin/sh
$filtered_path_1=some_filter_function($1)
$filtered_path_2=o anumită_funcție_de_filtru($2)
cp -R $cale_filtrată_1 $cale_filtrată_2

fundal

Am jenkinsfile și numesc sh 'sudo /home/copy.sh ${Workspace} ${targetdir}' în acest jenkinsfile. Deoarece utilizatorul jenkins nu are acces de scriere pe ${targetdir}, i-am acordat utilizatorului jenkins privilegii root numai pentru acest script copy.sh prin

sudo visudo jenkins    
ALL = NOPASSWD: /home/copy.sh, 

Și acest jenkinsfile este în depozitul git. Dacă tipul rău modifică acest fișier jenkins cu cod rău, cum ar fi repornirea și îl comite, atunci scriptul de copiere este apelat automat. Deoarece acest script este numit în privilegiul root, el poate face lucruri rele folosind acest punct slab. El va elimina sh 'sudo /home/copy.sh ${Workspace} ${targetdir}' și va adăuga sh 'sudo /home/copy.sh /tmp /var;reboot'.

Cum pot să-l protejez?

drapel cn
Lipiți codul în https://www.shellcheck.net pentru sfaturi care vor rezolva această problemă.
Denis Turgenev avatar
drapel cn
@glenn, mulțumesc și cred că nu oferă o soluție cum să schimbi $1->$safe1.
drapel ru
@DenisTurgenev Nu are nimic de-a face cu analiza argumentelor pentru a fi sigură. Are totul de-a face cu mediul shell în care executați în mod implicit (adică bash). Răspunsul meu detaliază acest lucru în întregime. Și vă oferă un script de testare și un set de comenzi care vă arată acest lucru în acțiune fără a vă exploda sistemul
bac0n avatar
drapel cn
`./copy.sh evil.sh copy.sh` hoops
Puncte:2
drapel ru

Acest lucru nu are nimic de-a face cu scenariul tău. În shell Bash, ; este văzută ca o comandă de terminare pentru șirul de comenzi și apoi imediat după aceasta este o comandă secundară. Deci, de fapt, modul în care lucrurile dvs. au fost procesate după cum urmează.

  1. Executați comanda înainte de ;:

    ./copycron.sh /home/apple /home/pie
    
  2. Executați a doua comandă după ;:

     reporniți
    

Pentru că ai executat probabil ca rădăcină sau superutilizator, a repornit cu succes.

Cu toate acestea, dacă faceți ceva mai specific și executați o altă comandă arbitrară după ; în schimb, veți observa că comanda este rulată. Cele două argumente ale scriptului dvs. vor rămâne /acasă/măr și /acasă/plăcintă respectiv. Scenariul nu vede niciodată ;reporniți parte pentru că nu este analizat ca argument. Aceasta este o limitare Bash și nu ceva din scriptul tău.


Puteți testa acest lucru cu următorul script și apoi apelurile de comandă:

FIȘIER: argecho.sh

#!/bin/bash

echo „Argumente delimitate de spațiu: $*”
ecou ""
ecou "------"
ecou ""

COMANDA DE EXECUTARE: ./argecho.sh foo bar baz /tmp/something.txt;echo Am făcut altceva

IEȘIRE:

$ ./argecho.sh foo bar baz /tmp/something.txt;echo Am mai făcut ceva în afara scenariului, vezi?
Argumente delimitate de spațiu: foo bar baz /tmp/something.txt

------

Am făcut altceva în afara scenariului, vezi?

Veți observa că „ecoul” și celelalte argumente din acesta nu au fost incluse în argumentele dumneavoastră în scriptul dumneavoastră. Acesta este comportamentul Bash standard.



Pe baza editărilor dvs., preocuparea dvs. este că cineva vă va deturna comenzile din depozitul Jenkins și va emite o comandă rău intenționată, schimbând scriptul din sh 'copycron "${Workspace}" "${targetdir}"' la sh copycron /home /boot;închidere

Din păcate pentru dvs., acest lucru nu are absolut nimic pe care să îl puteți remedia, acest lucru ar duce la eșecul dvs. de a controla corect cine are acces la depozitele de comenzi. Astfel de actori de amenințări ar avea mult mai mult acces pentru a vă deteriora sistemul, nu doar să ruleze o comandă simplă precum modificările menționate mai sus. Mai probabil că ar instala malware pe sistemul dvs., decât orice, și dacă nu vă securizați corect arhivele de comenzi, astfel încât nimeni să nu le poată „edita aleatoriu”, lipsa dvs. de control asupra depozitelor este ceea ce vă va pune peste cap.

Nu există nicio întărire reală pe care o putem face aici dacă utilizatorul jenkins are privilegii sudo nelimitate. Pur și simplu nu există, deoarece acest lucru se va baza pe asigurarea corectă a sistemelor sau construirea unui mecanism de implementare alternativ care este mai sigur și nu necesită sudo a lucra cu totul.

Denis Turgenev avatar
drapel cn
Am jenkinsfile și apelez `sh 'copycron ${Workspace} ${targetdir}'` în jenkinsfile. Și acest jenkinsfile este în depozitul git. Utilizatorul jenkins are privilegii root numai pe acest script copycron prin `sudo visudo jenkins ALL = NOPASSWD: /home/copycron`, deoarece jenkins nu are acces de scriere la ${targetdir}, iar dacă tipul rău modifică acest fișier jenkins cu cod prost, cum ar fi repornire și comite, atunci scripturile copycron sunt apelate automat și pentru că acest script este numit în privilegiul root, el poate face lucruri rele.
drapel ru
Aceasta este o limitare a apelului dvs. prin `sh`, nu o limitare a tuturor celorlalte sau chiar a scriptului dvs. Problema este că `sh` execută acest lucru într-un shell la fel ca și cum l-am executa în Bash. Ar trebui să puneți ghilimele complete în jurul argumentelor dvs. dacă doriți să „igienizeze” și să nu îl rulați. I.E.`sh 'copycron "${Workspace}" "${targetdir}"'` În acest fel tratează ; ca parte a șirului. Apoi, scriptul dvs. pur și simplu va eroa deoarece targetdir nu poate fi găsit.
Denis Turgenev avatar
drapel cn
Problema este că tipul rău poate schimba cu ușurință scriptul meu. `sh 'copycron "${Workspace}" "${targetdir}"'` -> `sh copycron /home /boot;shutdown` Deoarece fișierul jenkins este în depozitul git.
drapel ru
@DenisTurgenev Cred că trebuie să pun o altă întrebare: de ce ești îngrijorat că „băiatul rău” este implicat? Dacă depozitul este securizat corespunzător, tipul rău nu va avea acces la editarea scriptului. Dacă tipul rău *obține* acces la script, sunteți hosped în orice fel, nu există nicio modalitate de a dezinfecta comanda pe care o specificați. Acesta este un eșec de a vă controla depozitele, nu o problemă de script Bash și *nu* ceva împotriva căruia vă veți putea proteja dacă nu vă securizați corect depozitele de comenzi.
Denis Turgenev avatar
drapel cn
Apropo, cum numești un tip așa rău în termeni de securitate? :) Nu sunt expert în securitate și nici în engleză.
Denis Turgenev avatar
drapel cn
Acesta este un proiect dezvoltat de 50 de dezvoltatori și, desigur, doar acești oameni pot accesa prin contul lor. De exemplu, un dezvoltator a fost concediat și, în timp ce el a părăsit compania, a spus „du-te la naiba!” și poate executa acest lucru. Dar este aceasta presupunere prea dură? :) Îmi place să îmi imaginez extrem, așa că iartă-mă dacă am fost prea dur.
drapel ru
Aceasta este o discuție mai amplă decât pot duce comentariile și ar începe să îmi solicite călăria de securitate pentru a vă oferi o explicație adecvată a problemei „amenințării interne” și a gestionării necorespunzătoare a utilizatorilor și a auditării necorespunzătoare din partea dvs. Dacă vrei să ai acel chat, pot crea o cameră de chat pentru tine și pentru a discuta acest lucru în profunzime, totuși este o problemă mult mai aprofundată decât poate fi discutată în comentarii.
Denis Turgenev avatar
drapel cn
mulțumesc, voi colecta mai multe probleme de securitate și vă voi contacta în curând. multumesc pentru timpul acordat si ajutorul valoros.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.