Normale Ansicht

Es gibt neue verfügbare Artikel. Klicken Sie, um die Seite zu aktualisieren.
Ältere BeiträgeHaupt-Feeds

GPIO Reloaded II: Bash

06. Januar 2024 um 16:42

Das ist der zweite Teil einer Mini-Serie zur GPIO-Nutzung am Raspberry Pi 5:

  • GPIO Reloaded I: Python (gpiozero, lgpio, gpiod, rpi-lgpio)
  • GPIO Reloaded II: Bash (gpiod, gpioget, gpioset, pinctrl)
  • GPIO Reloaded III: Kamera (rpicam-xxx, Picamera2)

Zu den wichtigsten Neuerungen beim Raspberry Pi 5 zählt nicht nur der viel schnellere SoC (System-on-a-Chip), sondern auch ein eigener I/O-Controller, der als eigener Chip realisiert ist (RP1). Dieser I/O-Chip bringt mit sich, dass etablierte Mechanismen zur GPIO-Steuerung nicht mehr funktionieren. Besonders stark betroffen sind Kommandos, die im Terminal oder in Bash-Scripts aufgerufen werden.

Veraltet: WiringPi, »gpio«, »raspi-gpio« und »pigpiod/pigs«

Im Verlauf eines Jahrzehnts haben sich diverse Kommandos etabliert, die mittlerweile veraltet sind. Dazu zählt das Kommando gpio aus dem WiringPi-Projekt, das bereits 2019 eingestellt wurde. Ebenfalls verabschieden müssen Sie sich von dessen Nachfolger-Kommando raspi-gpio: Das Kommando ist nicht mit dem neuen I/O-Chip RP1 kompatibel. Glücklicherweise lässt sich das Kommando relativ einfach durch pinctrl ersetzen.

Deutlich ärgerlicher ist, dass auch der beliebte Dämon pigpiod und das dazugehörende Kommando pigs der Kompatibilität zu RP1 zum Opfer gefallen ist. Absurderweise kann der Dienst Anfang 2024 im Raspberry-Pi-Konfigurationsprogramm als GPIO-Fernzugriff scheinbar weiterhin aktiviert werden.

Der »GPIO-Fernzugriff« kann scheinbar weiterhin aktiviert werden. Er ist aber inkompatibel zum Pi 5!

journalctl -u pigpiod beweist aber, dass der Dienst nicht funktioniert:

journalctl -u pigpiod

systemd[1]: Starting pigpiod.service - Daemon required to control GPIO pins via pigpio...
systemd[1]: Started pigpiod.service - Daemon required to control GPIO pins via pigpio.
pigpiod[88161]: 2023-12-29 11:02:24 gpioHardwareRevision: unknown rev code (d04170)
pigpiod[88161]: 2023-12-29 11:02:24 initCheckPermitted:
pigpiod[88161]: +---------------------------------------------------------+
pigpiod[88161]: |Sorry, this system does not appear to be a raspberry pi. |
pigpiod[88161]: |aborting.                                                |
pigpiod[88161]: +---------------------------------------------------------+
pigpiod[88161]: Can't initialise pigpio library
systemd[1]: pigpiod.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: pigpiod.service: Failed with result 'exit-code'.

Das Problem ist bekannt, aber es sieht nicht so aus, als könnte es behoben werden: https://github.com/joan2937/pigpio/issues/589

gpioget und gpioset

Welche Kommandos funktionieren dann noch? Sie haben die Wahl zwischen den gpioxxx-Kommandos aus dem Paket gpiod sowie pinctrl (siehe den folgenden Abschnitt). Das Paket gpiod ist standardmäßig installiert. Die darin enthaltenen Kommandos nutzen zur Kommunikation mit dem Kernel die Device-Dateien /dev/gpiochip<n> und die Bibliothek libgpiod2.

Der größte Nachteil der Kommandos gpioget, gpioset usw. besteht darin, dass Sie als ersten Parameter die GPIO-Chip-Nummer angeben müssen. Diese variiert je nach Raspberry-Pi-Modell. Bei den Modellen der Serie 1 bis 4 müssen Sie die Nummer 0 angeben, ab Modell 5 die Nummer 4.

# LED ein- und ausschalten, die über den GPIO 7 gesteuert wird
# (= Pin 26 des J8-Headers)

# gpioset auf dem Raspberry Pi 5
gpioset 4 7=1; sleep 3; gpioset 4 7=0

# gpioset auf dem Raspberry Pi 1 bis 4
gpioset 0 7=1; sleep 3; gpioset 0 7=0

Warum variiert die GPIO-Chip-Nummer? Weil beim Raspberry Pi 4 die Kernel-Schnittstelle /dev/gpiochip0 für die GPIO-Steuerung verantwortlich ist (das sind in den BCM 2711 integrierte Funktionen), beim Pi 5 aber der RP1 (ein externer Chip) mit der Kernel-Schnittstelle /dev/gpiochip4. Informationen darüber, welche GPIO-Schnittstellen es gibt und welche GPIO-Funktion wie »verdrahtet« ist, geben die Kommandos gpiodetect und gpioinfo. Die folgenden Ausgaben gelten für den Raspberry Pi 5:

gpiodetect  

  gpiochip0 [gpio-brcmstb@107d508500] (32 lines)
  gpiochip1 [gpio-brcmstb@107d508520] ( 4 lines)
  gpiochip2 [gpio-brcmstb@107d517c00] (17 lines)
  gpiochip3 [gpio-brcmstb@107d517c20] ( 6 lines)
  gpiochip4 [pinctrl-rp1]             (54 lines)


gpioinfo    

  gpiochip0 - 32 lines:
    line   0:   "-"              unused   input  active-high 
    line   1:   "2712_BOOT_CS_N" "spi10 CS0" output active-low
    line   2:   "2712_BOOT_MISO" unused   input active-high 
    ...
  gpiochip1 - 4 lines:
    line   0: "WIFI_SDIO_D0"     unused   input active-high 
    line   1: "WIFI_SDIO_D1"     unused   input active-high 
    ...
  gpiochip2 - 17 lines:
    line   0: "RP1_SDA"          unused   input  active-high 
    line   1: "RP1_SCL"          unused   input  active-high 
    line   2: "RP1_RUN" "RP1 RUN pin"     output active-high 
    ...
  gpiochip3 - 6 lines:
    line   0: "HDMI0_SCL"        unused   input  active-high 
    line   1: "HDMI0_SDA"        unused   input  active-high 
    ...
  gpiochip4 - 54 lines:
    line   0: "ID_SD"            unused   input  active-high 
    line   1: "ID_SC"            unused   input  active-high 
    line   2: "PIN3"             unused   input  active-high 
    line   3: "PIN5"             unused   input  active-high 
    line   4: "PIN7"        "onewire@0"   output active-high
    line   5: "PIN29"       "onewire@0"   output active-low
    line   6: "PIN31"            unused   input  active-high 
    line   7: "PIN26"            unused   input  active-high 
    line   8: "PIN24"            unused   input  active-high 
    line   9: "PIN21"            unused   input  active-high 
    line  10: "PIN19"            unused   input  active-high 
    ...
    line  28: "PCIE_RP1_WAKE"    unused   input  active-high 
    line  29: "FAN_TACH"         unused   input  active-high 
    line  30: "HOST_SDA"         unused   input  active-high 
    line  31: "HOST_SCL"         unused   input  active-high 
    line  32: "ETH_RST_N"   "phy-reset"  output  active-low 
    ...

Um Scripts zu programmieren, die universell funktionieren, können Sie die folgenden Zeilen in den Code einbauen:

# chip=4 für RPi5, chip=0 für ältere Modelle
if gpiodetect | grep -q "pinctrl-rp"; then
  chip=4
else
  chip=0
fi

In der einfachsten Form schalten Sie mit gpioset einen GPIO-Ausgang auf High oder Low. In den folgenden Beispielen bezieht sich der erste Parameter auf die gpiochip-Nummer. 7 gibt die GPIO-Nummer in BCM-Nomenklatur an, 1 oder 0 den gewünschten Zustand:

gpioset $chip 7=1   # GPIO 7 (Pin 26) auf High stellen
gpioset $chip 7=0   # GPIO 7 (Pin 26) auf Low stellen

Sie können auch mehrere Ausgänge auf einmal steuern (hier GPIO 7, 8 und 25):

gpioset $chip 7=0 8=1 25=0 

Durch diverse Optionen können Sie weitere Funktionen steuern (siehe auch man gpioset):

  • --bias=as-is|disable|pull-down|pull-up aktiviert die internen Pull-up- oder Pull-down-Widerstände.
  • --mode=exit|wait|time|signal gibt an, wie lange das Kommando laufen soll. Standardmäßig gilt exit, das Kommando wird also sofort beendet. Mit wait wartet das Programm, bis der Benutzer [Return] drückt. Bei der Einstellung time können Sie mit --sec=<n> oder --usec=<n> die gewünschte Wartezeit einstellen. signal bedeutet, dass das Programm weiterläuft, bis es mit [Strg]+[C] beendet wird.

  • --background führt das Kommando als Hintergrunddienst weiter.

gpioget funktioniert analog zu gpioset: Sie übergeben im ersten Parameter die gpiochip-Nummer (in aller Regel 0), im zweiten Parameter die BCM-Nummer des GPIOs, dessen Input Sie auswerten wollen. Das Ergebnis des Kommandos lautet 0 oder 1, je nachdem, welchen Zustand der Eingang hat.

gpioget $chip 9   # Zustand von GPIO 9 (Pin 21) auslesen
0

pinctrl

Auch mit pinctrl aus dem Paket raspi-utils können Sie GPIO-Funktionen steuern. Der Vorteil von pinctrl besteht darin, dass das Kommando zur Zeit mit allen Raspberry-Pi-Modellen kompatibel ist. Eine Fallunterscheidung, ob das Script auf einem alten oder neuen Modell mit RP1-Chip läuft, entfällt. Außerdem ist das Kommando syntaktisch weitestgehend zu raspi-gpio kompatibel.

Gegen den Einsatz des Kommandos spricht der Umstand, dass das Kommando laut pinctrl -h (der einzigen mir bekannten Dokumentation) nur für Debugging-Zwecke gedacht ist.

Die folgende Aufzählung fasst die wichtigsten Anwendungen des Kommandos zusammen:

  • pinctrl get [gpionr] ermittelt den aktuellen Status aller GPIOs bzw. des angegebenen GPIOs.
  • pinctrl funcs [gpionr] ermittelt, welche alternativen Funktionen der angegebene GPIO bzw. alle GPIOs erfüllen können.

  • pinctrl set gpionr options verändert den Status des angegeben GPIOs. Mögliche Optionen sind:

    • ip = Input
    • op = Output
    • dl = Zustand Low (Drive Low)
    • dh = Zustand High (Drive High)
    • pu = Pull-up-Widerstand aktiv
    • pd = Pull-down-Widerstand aktiv
    • pn = keine Pull-up/down-Funktion
    • a0 bis a7 = alternative Funktion n aktivieren
    • no = Deaktivieren (no function)

Soweit sich sinnvolle Kombinationen ergeben, dürfen mehrere der obigen Optionen auf einmal übergeben werden, jeweils getrennt durch Leerzeichen. Welche alternative Funktionen ein GPIO unterstützt und wie sie nummeriert sind, geht aus pinctrl funcs hervor.

Das folgende Kommando ermittelt, welche Funktionen der GPIO mit der BCM-Nummer 23 unterstützt. Auf dem Raspberry Pi ist dieser GPIO mit Pin 16 des J8-Headers verbunden. GPIO23 kann diverse Funktionen übernehmen:

pinctrl funcs 23

  23, PIN16/GPIO23, SD0_CMD, DPI_D19, I2S0_SDO1, SCL3, 
  I2S1_SDO1, SYS_RIO023, PROC_RIO023, PIO23

Wenn Sie über Pin 26 (BCM-Nummer 07) eine Leuchtdiode angeschlossen haben, dann können Sie die LED wie folgt ein- und ausschalten:

pinctrl set 7 op dh   # LED an Pin 26 ein
pinctrl set 7 op dl   # LED an Pin 26 aus

Quellen/Links

Nvidia-Grafikkarten-Treiber: Angreifer kann Befehle ausführen

08. November 2023 um 12:14

Schwachstellen in den Treibern für Linux- und Windows-Systeme mit Grafikkarten von Nvidia haben zur Folge, dass Angreifer Attacken gegen diese System ausführen können. Insgesamt wurden vier Sicherheitslücken (CVE-2023-31016, CVE-2023-31017, CVE-2023-31019, CVE-2023-31027) mit dem Bedrohungsgrad hoch kürzlich in den entsprechenden Treibern entdeckt. Angreifer können dadurch höhere Rechte auf dem System erlangen und damit Befehle ausführen. Auch kann der Angreifer so unberechtigt an Informationen auf dem System gelangen. Ebenso sind auch Denial-of-Service-Attacken möglich.

 

Der Beitrag Nvidia-Grafikkarten-Treiber: Angreifer kann Befehle ausführen erschien zuerst auf Linux-Magazin.

SugarCRM: Angreifer kann Befehle ausführen

30. Oktober 2023 um 09:30

Infolge unzureichender Überprüfungen von Benutzereingaben bestehen Sicherheitslücken im Customer-Relationship-Management System SugarCRM. Die Entwickler bewerten das Risiko als hoch. In einem Fall ermöglicht das Notes-Modul Angreifern, eigenen PHP-Code hochzuladen, da es Benutzereingaben nicht ausreichend prüft. Im zweiten Fall liegt die Schwachstelle in der GecControl Aktion des Import-Moduls, wo eine unzureichende Bereinigung von Nutzereingaben über den field_name-Parameter Path-Traversal Angriffe ermöglicht. Reguläre Benutzerrechte sind ausreichend, um diese Angriffe durchzuführen. Sicherheitspatches stehen zur Behebung dieser Probleme zur Verfügung.

Der Beitrag SugarCRM: Angreifer kann Befehle ausführen erschien zuerst auf Linux-Magazin.

Kritische VMware-Schwachstellen

24. Oktober 2023 um 08:29

VMware hat zwei Sicherheitswarnungen veröffentlicht, die vor hochriskanten Sicherheitslücken in Produkten wie VMware Aria Operations for Logs, VMware Fusion und VMware Workstation warnen.

In VMware Aria Operations for Logs haben nicht autorisierte Angreifer die Möglichkeit, Dateien in das Betriebssystem der betroffenen Geräte einzuschleusen und damit schadhaften Code auszuführen (CVE-2023-34051). Darüber hinaus können Angreifer mit begrenzten Zugriffsrechten die Deserialisierung von Daten auslösen, wodurch die Authentifizierung umgangen werden kann (CVE-2023-34052).

 

 

Der Beitrag Kritische VMware-Schwachstellen erschien zuerst auf Linux-Magazin.

Squid-Proxy: Zahlreiche Sicherheitslücken

16. Oktober 2023 um 13:53

Joshua Rogers hat Anfang 2021 insgesamt 55 Sicherheitslücken in dem Web Cache Squid entdeckt. Aktuell wurden immer noch 35 dieser Schwachstellen noch nicht korrigiert. Squid ist ein Open-Source-Proxy-Server und Web-Caching-Programm zur Verbesserung der Netzwerkeffizienz und Sicherheit.  Derzeit sind über 2,5 Millionen Instanzen im Internet verfügbar. Rogers hat  die 55 Sicherheitslecks unter Verwendung verschiedener Techniken wie Fuzzing, manueller Codeüberprüfung und statistischer Analyse entdeckt. In einem Blog-Post berichtet er nun, dass die meisten dieser Schwachstellen bisher noch nicht behoben wurden. Als Grund führt er den Personalmangel des Squid-Projekts an. Mittlerweile sind für die Schwachstellen auch Proof-of-Concepts Exploits im Umlauf.

Der Beitrag Squid-Proxy: Zahlreiche Sicherheitslücken erschien zuerst auf Linux-Magazin.

Gnome: Schadcode durch Klicken

12. Oktober 2023 um 07:47

Ein Programmierfehler in der libcue-Bibliothek führt zu einer Sicherheitslücke in Gnome. Ein Angreifer kann dadurch Befehle mit den Rechten des Anwenders ausführen. Bei CUE handelt es sich um Metadaten für CD-Abbilder, die immer noch beim FLAC Audio-Codec Verwendung finden.

Deshalb verarbeiten viele moderne Audio-Player wie Audacious immer noch solche Dateien. Zusätzlich integriert Gnome die Anwendung tracker-miners, die dazu dient, Dateien im Benutzer-Homeverzeichnis zu indexieren, um ihre Durchsuchbarkeit zu verbessern. Wenn Dateien in speziellen Unterverzeichnissen des Home-Verzeichnisses wie ~/Downloads abgelegt oder geändert werden, erfolgt automatisch eine Aktualisierung des Index durch tracker-miners. Der Angreifer muss lediglich sein Opfer dazu bringen, einen Link anzuklicken, der den Schadcode ausführt.

Libcue wies einen Fehler bei der Verarbeitung des “INDEX”-Elements in den Cue-Sheets auf. Dieser Fehler trat auf, wenn anstelle von “INDEX 01 00:00:00” (im Format Index, Tracknummer, Startzeit) beispielsweise “INDEX 4294567296 0” im Cue-Sheet erschien. Dies führte zu einem Integer-Überlauf, da die Funktionen den Wert 2^32 in -400000 umwandelten, anstatt ihn zu erkennen. Darüber hinaus überprüfte eine weitere Funktion namens “track_set_index” nicht, ob der Index positiv war, was dazu führte, dass der Code an einer Stelle außerhalb des beabsichtigten Speicherbereichs schreiben konnte.

 

 

Der Beitrag Gnome: Schadcode durch Klicken erschien zuerst auf Linux-Magazin.

❌
❌