Was haltet Ihr von pip-audit? Gut, schlecht, sinnlos?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
August1328
User
Beiträge: 71
Registriert: Samstag 27. Februar 2021, 12:18

Hallo zusammen,

was haltet Ihr von Bibliotheken wie pip-audit? Also der Überprüfung der Python Umgebung auf bekannte Schwachstellen? https://pypi.org/project/pip-audit/

Nachdem meine Python Skripte inzwischen machen was sie sollen, habe ich die letzten Wochen damit verbracht, diese schrittweise zu verbessern, d.h. eine saubere Struktur mit Funktionen unter Einhaltung der Python-Normen (die hier dankenswerterweise mit einer Engelsgeduld immer wieder erklärt werden :D ) aufzubauen.

Das Update der Bibliotheken und Backup des Projekts auf 2 Rechnern (PC und Laptop) machen nach ein paar Startschwierigkeiten auch keine Problem mehr.

Nun steht als letzter Punkt auf meiner 2Do-Liste noch "Sicherheit Projekt / System" und ich habe mich am Wochenende ein wenig eingelesen und dabei die Bibliothek pip-audit gefunden - aber ich frage mich, brauche ich sowas überhaupt? Oder reicht das, wenn man regelmäßig, also z.B. 1x im Monat die genutzten Bibliotheken auf ein Update überprüft und dieses ggf. installiert?

Wie geht Ihr mit dem Thema Sicherheit um? Oder ist das bei einem kleinen privaten Projekt egal?

Gruß
Andy
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das kommt drauf an. Wenn deine Skripte irgendwie von außen (z.B. via Internet) erreichbar sind und da schützenswerte Daten abhanden kommen könnte, dann sollte man das Thema sehr ernst nehmen. Gleiches gilt, wenn es Skript irgendwas von extern zieht (z.B. einen Request an eine externe API) und darüber das System manipuliert werden könnte.

Wenn das ganze nur irgendwie irgendwo in einem geschlossenen System läuft (z.B. Heimnetzwerk) ist das ganz IMHO nicht so wild.

Gruß, noisefloor
August1328
User
Beiträge: 71
Registriert: Samstag 27. Februar 2021, 12:18

Hallo noisefloor,

danke für den Kommentar, dann werde ich das in meine Updates-Routine mit einbeziehen.

Wie macht man sowas professionell? Ich habe zum Beispiel etwas über einen sogenannten Dependabot auf Github gelesen, aber Github nutze ich (noch) nicht zur Verwaltung meiner Skripte.

Gruß
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Das habe ich noch nie genutzt. Werde ich aber mal ausprobieren.

Man kann sich Abhängigkeiten durch andere Bibliotheken erzeugen. Dann hat man Pakete installiert, von denen man nichts weiß. Wenn man nun lange ein Framework nicht mehr aktualisiert hat, wird es irgendwann ein Paket treffen, dass die veraltete Version eines Frameworks nutzt.

Schlimm sind auch Pakete, die auf typo-squatting abzielen, wie erwartet funktionieren, aber gleichzeitig private Daten vom lokalen PC an irgendeinen Server senden.

Ich hab das Tool jetzt mal getestet. Folgendes Ergebnis:

Code: Alles auswählen

[deadeye@nexus ~]$ pip-audit 
Found 1 known vulnerability in 1 package
Name Version ID             Fix Versions
---- ------- -------------- ------------
zstd 1.5.5.1 PYSEC-2023-121
[deadeye@nexus ~]$ 
Funktioniert :-)
Übrigens nutze ich Python 3.12.0. Also so alt ist die Installation nicht. Das Paket hatte ich installiert und war keine Abhängigkeit.

Wenn wir schon dabei sind: https://pypi.org/project/pipdeptree/
Ich war mich nicht sicher, ob es nicht vielleicht doch eine Abhängigkeit war, aber keins der installierten Pakete setzt zstd voraus.

Code: Alles auswählen

[deadeye@nexus ~]$ pipdeptree 
aiofiles==23.2.1
Brotli==1.1.0
colorama==0.4.6
fastapi==0.103.2
├── anyio [required: >=3.7.1,<4.0.0, installed: 3.7.1]
│   ├── idna [required: >=2.8, installed: 3.4]
│   └── sniffio [required: >=1.1, installed: 1.3.0]
├── pydantic [required: >=1.7.4,<3.0.0,!=2.1.0,!=2.0.1,!=2.0.0,!=1.8.1,!=1.8, installed: 2.4.2]
│   ├── annotated-types [required: >=0.4.0, installed: 0.6.0]
│   ├── pydantic-core [required: ==2.10.1, installed: 2.10.1]
│   │   └── typing-extensions [required: >=4.6.0,!=4.7.0, installed: 4.8.0]
│   └── typing-extensions [required: >=4.6.1, installed: 4.8.0]
├── starlette [required: >=0.27.0,<0.28.0, installed: 0.27.0]
│   └── anyio [required: >=3.4.0,<5, installed: 3.7.1]
│       ├── idna [required: >=2.8, installed: 3.4]
│       └── sniffio [required: >=1.1, installed: 1.3.0]
└── typing-extensions [required: >=4.5.0, installed: 4.8.0]
filelock==3.12.4
flask==3.0.0
├── blinker [required: >=1.6.2, installed: 1.6.2]
├── click [required: >=8.1.3, installed: 8.1.7]
├── itsdangerous [required: >=2.1.2, installed: 2.1.2]
├── Jinja2 [required: >=3.1.2, installed: 3.1.2]
│   └── MarkupSafe [required: >=2.0, installed: 2.1.3]
└── werkzeug [required: >=3.0.0, installed: 3.0.0]
    └── MarkupSafe [required: >=2.1.1, installed: 2.1.3]
ftfy==6.1.1
└── wcwidth [required: >=0.2.5, installed: 0.2.8]
ipython==8.16.1
├── backcall [required: Any, installed: 0.2.0]
├── decorator [required: Any, installed: 5.1.1]
├── jedi [required: >=0.16, installed: 0.19.1]
│   └── parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
├── matplotlib-inline [required: Any, installed: 0.1.6]
│   └── traitlets [required: Any, installed: 5.11.1]
├── pexpect [required: >4.3, installed: 4.8.0]
│   └── ptyprocess [required: >=0.5, installed: 0.7.0]
├── pickleshare [required: Any, installed: 0.7.5]
├── prompt-toolkit [required: >=3.0.30,<3.1.0,!=3.0.37, installed: 3.0.39]
│   └── wcwidth [required: Any, installed: 0.2.8]
├── Pygments [required: >=2.4.0, installed: 2.16.1]
├── stack-data [required: Any, installed: 0.6.3]
│   ├── asttokens [required: >=2.1.0, installed: 2.4.0]
│   │   └── six [required: >=1.12.0, installed: 1.16.0]
│   ├── executing [required: >=1.2.0, installed: 2.0.0]
│   └── pure-eval [required: Any, installed: 0.2.2]
└── traitlets [required: >=5, installed: 5.11.1]
littlefs-python==0.8.0
loguru==0.7.2
matplotlib==3.8.0
├── contourpy [required: >=1.0.1, installed: 1.1.1]
│   └── numpy [required: >=1.26.0rc1,<2.0, installed: 1.26.0]
├── cycler [required: >=0.10, installed: 0.12.0]
├── fonttools [required: >=4.22.0, installed: 4.43.0]
├── kiwisolver [required: >=1.0.1, installed: 1.4.5]
├── numpy [required: >=1.21,<2, installed: 1.26.0]
├── packaging [required: >=20.0, installed: 23.2]
├── Pillow [required: >=6.2.0, installed: 10.0.1]
├── pyparsing [required: >=2.3.1, installed: 3.1.1]
└── python-dateutil [required: >=2.7, installed: 2.8.2]
    └── six [required: >=1.5, installed: 1.16.0]
paho-mqtt==1.6.1
pip-audit==2.6.1
├── cachecontrol [required: >=0.13.0, installed: 0.13.1]
│   ├── msgpack [required: >=0.5.2, installed: 1.0.7]
│   └── requests [required: >=2.16.0, installed: 2.31.0]
│       ├── certifi [required: >=2017.4.17, installed: 2023.7.22]
│       ├── charset-normalizer [required: >=2,<4, installed: 3.3.1]
│       ├── idna [required: >=2.5,<4, installed: 3.4]
│       └── urllib3 [required: >=1.21.1,<3, installed: 2.0.7]
├── cyclonedx-python-lib [required: ~=4.0, installed: 4.2.3]
│   ├── license-expression [required: >=30,<31, installed: 30.1.1]
│   │   └── boolean.py [required: >=4.0, installed: 4.0]
│   ├── packageurl-python [required: >=0.11, installed: 0.11.2]
│   ├── py-serializable [required: >=0.11.1,<0.12.0, installed: 0.11.1]
│   │   └── defusedxml [required: >=0.7.1,<0.8.0, installed: 0.7.1]
│   └── sortedcontainers [required: >=2.4.0,<3.0.0, installed: 2.4.0]
├── html5lib [required: >=1.1, installed: 1.1]
│   ├── six [required: >=1.9, installed: 1.16.0]
│   └── webencodings [required: Any, installed: 0.5.1]
├── packaging [required: >=23.0.0, installed: 23.2]
├── pip-api [required: >=0.0.28, installed: 0.0.30]
│   └── pip [required: Any, installed: 23.3.1]
├── pip-requirements-parser [required: >=32.0.0, installed: 32.0.1]
│   ├── packaging [required: Any, installed: 23.2]
│   └── pyparsing [required: Any, installed: 3.1.1]
├── requests [required: >=2.31.0, installed: 2.31.0]
│   ├── certifi [required: >=2017.4.17, installed: 2023.7.22]
│   ├── charset-normalizer [required: >=2,<4, installed: 3.3.1]
│   ├── idna [required: >=2.5,<4, installed: 3.4]
│   └── urllib3 [required: >=1.21.1,<3, installed: 2.0.7]
├── rich [required: >=12.4, installed: 13.6.0]
│   ├── markdown-it-py [required: >=2.2.0, installed: 3.0.0]
│   │   └── mdurl [required: ~=0.1, installed: 0.1.2]
│   └── Pygments [required: >=2.13.0,<3.0.0, installed: 2.16.1]
└── toml [required: >=0.10, installed: 0.10.2]
pipdeptree==2.13.0
ptpython==3.0.23
├── appdirs [required: Any, installed: 1.4.4]
├── jedi [required: >=0.16.0, installed: 0.19.1]
│   └── parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
├── prompt-toolkit [required: >=3.0.28,<3.1.0, installed: 3.0.39]
│   └── wcwidth [required: Any, installed: 0.2.8]
└── Pygments [required: Any, installed: 2.16.1]
pyperformance==1.0.9
├── packaging [required: Any, installed: 23.2]
└── pyperf [required: Any, installed: 2.6.1]
    └── psutil [required: >=5.9.0, installed: 5.9.5]
pyright==1.1.331
└── nodeenv [required: >=1.6.0, installed: 1.8.0]
    └── setuptools [required: Any, installed: 68.2.2]
PySide2==5.13.2
└── shiboken2 [required: ==5.13.2, installed: 5.13.2]
python-can==4.2.2
├── msgpack [required: ~=1.0.0, installed: 1.0.7]
├── packaging [required: Any, installed: 23.2]
├── setuptools [required: Any, installed: 68.2.2]
├── typing-extensions [required: >=3.10.0.0, installed: 4.8.0]
└── wrapt [required: ~=1.10, installed: 1.15.0]
pyzmq==25.1.1
richbench==1.0.3
├── pyinstrument [required: Any, installed: 4.5.3]
└── rich [required: Any, installed: 13.6.0]
    ├── markdown-it-py [required: >=2.2.0, installed: 3.0.0]
    │   └── mdurl [required: ~=0.1, installed: 0.1.2]
    └── Pygments [required: >=2.13.0,<3.0.0, installed: 2.16.1]
scipy==1.11.3
└── numpy [required: >=1.21.6,<1.28.0, installed: 1.26.0]
shed==2023.6.1
├── autoflake [required: >=1.4, installed: 2.2.1]
│   └── pyflakes [required: >=3.0.0, installed: 3.1.0]
├── black [required: >=23.3.0, installed: 23.9.1]
│   ├── click [required: >=8.0.0, installed: 8.1.7]
│   ├── mypy-extensions [required: >=0.4.3, installed: 1.0.0]
│   ├── packaging [required: >=22.0, installed: 23.2]
│   ├── pathspec [required: >=0.9.0, installed: 0.11.2]
│   └── platformdirs [required: >=2, installed: 3.11.0]
├── com2ann [required: >=0.3.0, installed: 0.3.0]
├── isort [required: >=5.10.1, installed: 5.12.0]
├── libcst [required: >=0.4.10, installed: 1.1.0]
│   ├── PyYAML [required: >=5.2, installed: 6.0.1]
│   ├── typing-extensions [required: >=3.7.4.2, installed: 4.8.0]
│   └── typing-inspect [required: >=0.4.0, installed: 0.9.0]
│       ├── mypy-extensions [required: >=0.3.0, installed: 1.0.0]
│       └── typing-extensions [required: >=3.7.4, installed: 4.8.0]
└── pyupgrade [required: >=3.0.0, installed: 3.15.0]
    └── tokenize-rt [required: >=5.2.0, installed: 5.2.0]
stem==1.8.2
sympy==1.12
└── mpmath [required: >=0.19, installed: 1.3.0]
thonny==4.1.3
├── asttokens [required: >=2.0, installed: 2.4.0]
│   └── six [required: >=1.12.0, installed: 1.16.0]
├── docutils [required: >=0.16, installed: 0.20.1]
├── jedi [required: >=0.18.1, installed: 0.19.1]
│   └── parso [required: >=0.8.3,<0.9.0, installed: 0.8.3]
├── mypy [required: >=0.761, installed: 1.6.0]
│   ├── mypy-extensions [required: >=1.0.0, installed: 1.0.0]
│   └── typing-extensions [required: >=4.1.0, installed: 4.8.0]
├── pylint [required: >=2.4, installed: 3.0.0]
│   ├── astroid [required: >=3.0.0,<=3.1.0-dev0, installed: 3.0.0]
│   ├── dill [required: >=0.3.6, installed: 0.3.7]
│   ├── dill [required: >=0.3.7, installed: 0.3.7]
│   ├── isort [required: >=4.2.5,<6, installed: 5.12.0]
│   ├── mccabe [required: >=0.6,<0.8, installed: 0.7.0]
│   ├── platformdirs [required: >=2.2.0, installed: 3.11.0]
│   └── tomlkit [required: >=0.10.1, installed: 0.12.1]
├── pyserial [required: >=3.4, installed: 3.5]
├── Send2Trash [required: >=1.5, installed: 1.8.2]
├── setuptools [required: >=45.2, installed: 68.2.2]
└── wheel [required: Any, installed: 0.41.2]
zstd==1.5.5.1
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

weiß jemand, wie sich das genannte `pip-audit` verhält, wenn es mit der Option `--fix` aufgerufen wird? Je nachdem, welches Python-Modul wann verwendet, weil man ja ggf. kein Update auf die aktuelle Version, sondern nur ein Update auf den nächsten Bugfixrelease. Beispiel wäre (bei mir) Django, weil es sonst ggf. zu Fehlern in der Anwendung kommt.

Gruß, noisefloor
August1328
User
Beiträge: 71
Registriert: Samstag 27. Februar 2021, 12:18

@deadeye: Danke, pipdeptree kannte ich nicht und das gibt nen sehr guten Überblick über die installierten Bibliotheken mit Abhängigkeiten. Ich habe ein wenig aufräumen können, da waren mehr unnnötige Module als ich ertwartet habe.

@noisefloor: Wenn ich das richtig in Erinnerung habe, kann man zusätzliche die Python environment oder Version mit angeben, oder welches Projekt ausschließlich geprüft werden soll. Irgendwie bin ich der Meinungm daß die PyPi Seite vor ein paar Tagen anders aussah, da wurde das ausführlicher beschrieben, daß es seit Version 2 die Einschränkung auf einzelne environment gibt, aber das finde ich nicht mehr. Es gibt auch die Möglichkeit eines dry-runs... Aber irgendwie funktionieren die Links / Anker bei mir nicht.

Ich habe nur eine Python Version auf meinen PC und habe einfach "pip-audit" laufen lassen. Das zeigt einem nur die Vulnerabilites an und installiert nichts von selber. Danach habe ich einzelne upgrades per "pip install --upgrade" installiert.
Also, ich würde sagen, einfach blank testen und sehen, was es ausspuckt.

Schönen Abend
Antworten