Ištirkite Bandit, galingą saugumo tikrinimo įrankį, skirtą Python. Sužinokite, kaip aptikti įprastus pažeidžiamumus, įgyvendinti saugaus kodavimo praktiką ir pagerinti programinės įrangos bendrą saugumo būklę.
Bandit saugumo tikrinimas: Python saugumo pažeidžiamumų nustatymas ir šalinimas
Šiandieniniame sudėtingame kibernetinio saugumo kraštovaizdyje proaktyvios saugumo priemonės yra itin svarbios. Python, žinomas dėl savo universalumo ir paprastumo, yra populiarus pasirinkimas įvairioms programoms. Tačiau, kaip ir bet kuri programavimo kalba, Python kodas gali būti jautrus saugumo pažeidžiamumams. Būtent čia įsijungia Bandit – galingas saugumo tikrinimo įrankis, sukurtas automatiškai nustatyti galimus saugumo trūkumus jūsų Python kode.
Kas yra Bandit?
Bandit yra atvirojo kodo saugumo tikrintuvas, specialiai sukurtas Python. Jis veikia skenuodamas Python kodą, kad nustatytų įprastas saugumo problemas, naudodamas išsamų papildinių rinkinį, kad nustatytų galimus pažeidžiamumus. Pagalvokite apie tai kaip apie statinės analizės įrankį, kuris padeda anksti nustatyti saugumo problemas kūrimo ciklo metu, kol jos gali būti išnaudotos gamyboje.
Bandit veikia analizuodamas Python kodą ir kurdamas Abstract Syntax Tree (AST). Tada jis taiko eilę testų, pagrįstų žinomais pažeidžiamumo modeliais, AST. Radus galimą saugumo problemą, Bandit apie tai praneša, nurodydamas sunkumo lygį, pasitikėjimo lygį ir išsamų problemos aprašymą.
Kodėl naudoti Bandit?
Bandit integravimas į jūsų kūrimo darbo eigą suteikia keletą reikšmingų pranašumų:
- Ankstyvas pažeidžiamumo aptikimas: Bandit padeda nustatyti saugumo pažeidžiamumus anksti kūrimo procese, sumažinant išlaidas ir pastangas, reikalingas jiems vėliau ištaisyti.
- Patobulinta kodo kokybė: Įgyvendindamas saugaus kodavimo praktiką, Bandit prisideda prie bendros kodo kokybės ir priežiūros.
- Automatizuoti saugumo auditai: Bandit automatizuoja saugumo audito procesą, todėl lengviau užtikrinti, kad jūsų kodas atitiktų geriausią saugumo praktiką.
- OWASP Top 10 aprėptis: Bandit apima testus, kurie sprendžia daugelį pažeidžiamumų, išvardytų OWASP Top 10, padėdamas apsisaugoti nuo įprastų interneto programų saugumo rizikų.
- Pritaikomos taisyklės: Galite pritaikyti Bandit taisykles, kad jos atitiktų jūsų konkrečius saugumo reikalavimus ir kodavimo standartus.
- Integracija su CI/CD kanalais: Bandit gali būti lengvai integruotas į jūsų Continuous Integration/Continuous Deployment (CI/CD) kanalus, užtikrinant, kad saugumo patikrinimai būtų atliekami automatiškai su kiekvienu kodo pakeitimu.
Kaip pradėti naudoti Bandit
Štai nuoseklus vadovas, kaip pradėti naudoti Bandit:
1. Diegimas
Galite įdiegti Bandit naudodami pip, Python paketų diegimo programą:
pip install bandit
2. Bandit paleidimas
Norėdami paleisti Bandit savo Python kode, naudokite šią komandą:
bandit -r
Pakeiskite <directory>
katalogu, kuriame yra jūsų Python kodas. -r
vėliava nurodo Bandit rekursyviai nuskenuoti visus Python failus nurodytame kataloge.
Taip pat galite nurodyti atskirus failus:
bandit
3. Rezultatų interpretavimas
Bandit pateiks ataskaitą, kurioje bus išsamiai aprašyti visi galimi jūsų kode rasti saugumo pažeidžiamumai. Kiekvienam pažeidžiamumui priskiriamas sunkumo lygis (pvz., AUKŠTAS, VIDUTINIS, ŽEMAS) ir pasitikėjimo lygis (pvz., AUKŠTAS, VIDUTINIS, ŽEMAS). Ataskaitoje taip pat pateikiamas išsamus pažeidžiamumo aprašymas ir kodo eilutė, kurioje jis buvo rastas.
Bandit išvesties pavyzdys:
./example.py:10:0:B603 [blacklist] Use of subprocess.Popen with shell=True is known to be vulnerable to shell injection
Severity: High Confidence: High
Location: ./example.py:10
--------------------------------------------------
Ši išvestis rodo, kad Bandit rado didelio sunkumo pažeidžiamumą faile example.py
10 eilutėje. Pažeidžiamumas yra susijęs su subprocess.Popen
naudojimu su shell=True
, kuris yra žinomas kaip jautrus apvalkalo injekcijoms.
Įprasti saugumo pažeidžiamumai, kuriuos aptinka Bandit
Bandit gali aptikti daugybę įprastų saugumo pažeidžiamumų Python kode. Štai keletas pavyzdžių:
- Apvalkalo injekcija (B602, B603): Naudojant
subprocess.Popen
arbaos.system
su nepatikimais duomenimis gali atsirasti apvalkalo injekcijos atakos. - SQL injekcija (B608): Kurdami SQL užklausas naudodami eilutės sujungimą su vartotojo pateiktais duomenimis, galite atskleisti savo programą SQL injekcijų atakoms.
- Užkoduoti slaptažodžiai (B105): Slaptažodžių saugojimas tiesiogiai jūsų kode yra didelė saugumo rizika.
- Silpna kriptografija (B303, B304, B322): Naudojant silpnus arba pasenusius kriptografinius algoritmus, gali būti pažeistas jūsų duomenų konfidencialumas ir vientisumas.
- Nesaugus deserializavimas (B301, B401): Deserializuojant duomenis iš nepatikimų šaltinių, gali būti vykdomas savavališkas kodas.
- XML išorinės objekto (XXE) injekcija (B405): Analizuojant XML dokumentus iš nepatikimų šaltinių be tinkamo valymo, jūsų programa gali būti pažeista XXE injekcijos atakoms.
- Formato eilutės pažeidžiamumai (B323): Naudojant vartotojo pateiktus duomenis formato eilutėse be tinkamo valymo, gali atsirasti formato eilutės pažeidžiamumai.
- Naudojant `eval()` arba `exec()` (B301): Šios funkcijos vykdo savavališką kodą, o jų naudojimas su nepatikimais duomenimis yra itin pavojingas.
- Nesaugus laikinojo failo naudojimas (B308): Sukūrus laikinus failus nuspėjamoje vietoje, užpuolikai gali perrašyti arba skaityti slaptus duomenis.
- Trūksta arba neteisingas klaidų tvarkymas (B110): Netinkamai tvarkant išimtis, gali būti atskleista slapta informacija arba atsirasti paslaugos atsisakymo atakos.
Pavyzdys: Apvalkalo injekcijos pažeidžiamumo nustatymas ir taisymas
Pažvelkime į paprastą pavyzdį, kaip Bandit gali padėti nustatyti ir ištaisyti apvalkalo injekcijos pažeidžiamumą.
Apsvarstykite tokį Python kodą:
import subprocess
import os
def execute_command(command):
subprocess.Popen(command, shell=True)
if __name__ == "__main__":
user_input = input("Enter a command to execute: ")
execute_command(user_input)
Šis kodas gauna vartotojo įvestį ir vykdo ją kaip apvalkalo komandą, naudodamas subprocess.Popen
su shell=True
. Tai klasikinis apvalkalo injekcijos pažeidžiamumo pavyzdys.
Paleidus Bandit su šiuo kodu, bus pateikta ši išvestis:
./example.py:4:0:B603 [blacklist] Use of subprocess.Popen with shell=True is known to be vulnerable to shell injection
Severity: High Confidence: High
Location: ./example.py:4
--------------------------------------------------
Bandit teisingai nustato subprocess.Popen
naudojimą su shell=True
kaip didelio sunkumo pažeidžiamumą.
Norėdami ištaisyti šį pažeidžiamumą, turėtumėte vengti naudoti shell=True
ir vietoj to perduoti komandą ir jos argumentus kaip sąrašą į subprocess.Popen
. Taip pat turėtumėte išvalyti vartotojo įvestį, kad išvengtumėte kenkėjiškų komandų įterpimo.
Štai pataisyta kodo versija:
import subprocess
import shlex
def execute_command(command):
# Sanitize the input using shlex.split to prevent shell injection
command_list = shlex.split(command)
subprocess.Popen(command_list)
if __name__ == "__main__":
user_input = input("Enter a command to execute: ")
execute_command(user_input)
Naudodami shlex.split
, kad išvalytumėte vartotojo įvestį, ir perduodami komandą kaip sąrašą į subprocess.Popen
, galite sumažinti apvalkalo injekcijos atakų riziką.
Paleidus Bandit su pataisytu kodu, nebebus pranešama apie apvalkalo injekcijos pažeidžiamumą.
Bandit konfigūravimas
Bandit galima konfigūruoti naudojant konfigūracijos failą (bandit.yaml
arba .bandit
), kad būtų galima pritaikyti jo elgseną. Galite naudoti konfigūracijos failą:
- Išskirti failus arba katalogus: Nurodykite failus arba katalogus, kurie turėtų būti neįtraukti į skenavimą.
- Išjungti konkrečius testus: Išjunkite testus, kurie nėra aktualūs jūsų projektui.
- Sureguliuoti sunkumo lygius: Pakeiskite konkrečių pažeidžiamumų sunkumo lygius.
- Apibrėžti pasirinktines taisykles: Sukurkite savo pasirinktines taisykles, kad aptiktumėte su projektu susijusias saugumo problemas.
Štai bandit.yaml
konfigūracijos failo pavyzdys:
exclude:
- 'tests/'
- 'docs/'
skips:
- 'B101'
confidence_level:
MEDIUM:
- 'B603'
severity_level:
LOW:
- 'B105'
Šis konfigūracijos failas neįtraukia tests/
ir docs/
katalogų iš skenavimo, praleidžia B101
testą (kuris tikrina assert sakinių naudojimą), pakoreguoja B603
testo pasitikėjimo lygį į VIDUTINĮ ir pakoreguoja B105
testo sunkumo lygį į ŽEMĄ.
Bandit integravimas į jūsų CI/CD kanalą
Bandit integravimas į jūsų CI/CD kanalą yra labai svarbus žingsnis užtikrinant jūsų Python kodo saugumą. Automatiškai paleisdami Bandit su kiekvienu kodo pakeitimu, galite anksti nustatyti saugumo pažeidžiamumus ir neleisti jiems patekti į gamybą.
Štai pavyzdys, kaip integruoti Bandit į GitLab CI/CD kanalą:
stages:
- test
bandit:
image: python:3.9
stage: test
before_script:
- pip install bandit
script:
- bandit -r .
artifacts:
reports:
bandit: bandit.report
Ši konfigūracija apibrėžia bandit
užduotį, kuri paleidžia Bandit esamame kataloge. Užduotis naudoja Python 3.9 Docker vaizdą ir įdiegia Bandit naudodama pip. Komanda bandit -r .
paleidžia Bandit rekursyviai visuose esamo katalogo Python failuose. Skyriuje artifacts
nurodyta, kad Bandit ataskaita turėtų būti išsaugota kaip artefaktas, kurį galima atsisiųsti ir peržiūrėti.
Panašias konfigūracijas galima sukurti ir kitoms CI/CD platformoms, pvz., Jenkins, CircleCI ir GitHub Actions.
Už Bandit ribų: išsamios saugumo strategijos
Nors Bandit yra vertingas įrankis, padedantis nustatyti galimus saugumo pažeidžiamumus, svarbu prisiminti, kad tai tik viena iš išsamios saugumo strategijos dalių. Kitos svarbios saugumo praktikos yra:
- Saugaus kodavimo praktika: Laikykitės saugaus kodavimo gairių ir geriausios praktikos, kad sumažintumėte pažeidžiamumų atsiradimo jūsų kode riziką.
- Reguliarūs saugumo auditai: Reguliariai atlikite saugumo auditus, kad nustatytumėte ir išspręstumėte galimus jūsų programos saugumo trūkumus.
- Patekimo į sistemą bandymai: Atlikite patekimo į sistemą bandymus, kad imituotumėte realaus pasaulio atakas ir nustatytumėte pažeidžiamumus, kurių gali neaptikti statinės analizės įrankiai, pvz., Bandit.
- Pažeidžiamumo valdymas: Įdiekite pažeidžiamumo valdymo programą, kad galėtumėte sekti ir šalinti pažeidžiamumus jūsų programinėje įrangoje ir infrastruktūroje.
- Priklausomybių valdymas: Reguliariai atnaujinkite savo priklausomybes, kad ištaisytumėte žinomus trečiųjų šalių bibliotekų pažeidžiamumus. Tokie įrankiai kaip
pip-audit
irsafety
gali padėti tai padaryti. - Įvesties tikrinimas ir valymas: Visada tikrinkite ir valykite vartotojo įvestį, kad išvengtumėte injekcijos atakų ir kitų su įvestimi susijusių pažeidžiamumų.
- Autentifikavimas ir autorizacija: Įdiekite stiprius autentifikavimo ir autorizacijos mechanizmus, kad apsaugotumėte slaptus duomenis ir išteklius.
- Saugumo sąmoningumo mokymai: Suteikite saugumo sąmoningumo mokymus savo kūrėjams ir kitiems darbuotojams, kad jie susipažintų su įprastomis saugumo grėsmėmis ir geriausia praktika.
Išvada
Bandit yra vertingas įrankis, skirtas Python kodo saugumo pažeidžiamumams nustatyti ir sumažinti. Integravę Bandit į savo kūrimo darbo eigą, galite pagerinti savo programų saugumą ir apsisaugoti nuo įprastų saugumo grėsmių. Tačiau svarbu nepamiršti, kad Bandit yra tik viena iš visapusiškos saugumo strategijos dalių. Vadovaudamiesi saugaus kodavimo praktika, reguliariai atlikdami saugumo auditus ir įgyvendindami kitas saugumo priemones, galite sukurti saugesnę ir atsparesnę programinės įrangos aplinką.