- In GitHub Actions lässt sich die zum Ausführen eines
run:-Blocks verwendete Shell mit dem Schlüsselwort shell festlegen
- In Workflows ist das optional, in einzelnen Action-Definitionen jedoch erforderlich
- Der Standardwert wird je nach Betriebssystem automatisch gesetzt: unter Linux/macOS
bash, unter Windows pwsh
- Wenn man explizit
shell: bash setzt, werden auch die folgenden Standard-Flags hinzugefügt: --noprofile --norc -eo pipefail
Jedes ausführbare Programm kann als shell angegeben werden
- Man geht leicht davon aus, dass die für
shell nutzbaren Werte eingeschränkt sind
- Tatsächlich kann jede ausführbare Datei in
$PATH als Shell verwendet werden
- Wenn der auszuführende Befehl keine Dateieingabe annimmt, muss das spezielle Argument
{0} übergeben werden
{0} wird von GitHub automatisch durch den Pfad einer temporären Datei ersetzt
Experimentelle Beispiele
- Es ist sogar möglich, einen C-Compiler (
tcc) wie eine Shell zu verwenden und direkt auszuführen
- Ebenso kann man durch Manipulation von
$PATH eine gefälschte bash-Shell erstellen und verwenden
- GitHub kümmert sich nicht darum, welche ausführbare Datei tatsächlich im
shell-Eintrag angegeben ist
Sicherheitstechnische Implikationen
- In GitHub Actions ist die Grenze zwischen Dateischreiben und Ausführen unscharf (auch über
GITHUB_ENV, $GITHUB_PATH usw. besteht Ausführungspotenzial)
- Selbst bekannte Werte wie
shell: bash werden über $PATH aufgelöst und nicht über einen festen Ausführungspfad wie /bin/bash
- Anders als erwartet werden auch Werte wie
python wirklich pfadbasiert ausgeführt und nicht nur als Verweis auf einen Tool-Cache
2 Kommentare
Schon ein Blick in das Repository github/runner-image zeigt, dass dort ziemlich viele Pakete vorinstalliert sind, die man direkt nutzen kann....
Wenn man ein Image baut, sind 1 GB ganz schnell erreicht....
Hacker-News-Kommentare
-x-Option von bash verwendet, um die Ausgabe aller Befehle zu erzwingen, die in einem Actions-Workflow ausgeführt werden. Das ist für das Debugging sehr nützlich.repository_dispatch-Ereignisnamen mit Wildcards.ScriptHandler.csbefindet sich der gesamte Code, der Prozessumgebung, Argumente usw. vorbereitet.bashso austricksen, dass praktisch jedes Programm ausgeführt werden kann.goevalunterstützt derzeit noch keine Dateieingaben direkt.goeval.