Kommentare korrigiert nach Codex-Befund

Der Kopfkommentar versprach falsch, dass der Wert nur im Container staende.
Die Realitaet: guestExec() uebergibt die ganze Zeichenkette als sh -c, daher
steht der Praefx im Argv der VM-Shell. Debians dash optimiert ihn nicht weg.

Der echte Gewinn: Der Wert reist als Umgebungsvariable in den Container und
wird dort von sh eingesetzt — sitzt nicht im Prozessabbild DES CONTAINERS.
Das war auch bei command() mit OC_PASS=... schon so.

Testname: haelt den Wert aus dem occ-Aufruf heraus (prueft Innenteil).
Kommentar: Das "sh -c" trennt VM-Shell von Container.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
claude/nice-moser-521659
nexxo 2026-08-03 19:32:40 +02:00
parent 4feaba1bb1
commit 0c8b7813b4
2 changed files with 20 additions and 9 deletions

View File

@ -79,10 +79,20 @@ final class NextcloudOcc
* *
* command() taugt fuer `--password-from-env`, wo occ selbst die * command() taugt fuer `--password-from-env`, wo occ selbst die
* Umgebungsvariable liest. `config:system:set` kann das nicht: es will den * Umgebungsvariable liest. `config:system:set` kann das nicht: es will den
* Wert als Argument. Setzte die aeussere Shell ihn ein, stuende das * Wert als Argument.
* Passwort in der Prozessliste der KUNDEN-VM dort, wo jeder mit einer *
* Shell auf der Maschine `ps` ausfuehren kann. So steht es nur in der des * Ohne diese Methode staende der Wert an drei Stellen: im Argv der
* Containers. * VM-Shell (wo HttpProxmoxClient::guestExec() die ganze Zeichenkette als
* ['/bin/sh', '-c', $command] uebergibt), im Argv des docker-Aufrufs, und
* im Argv von `php occ` im Container. Mit dieser Methode reist der Wert
* als Umgebungsvariable in den Container und wird erst dort von der `sh`
* eingesetzt der Gewinn ist, dass er nicht im Prozessabbild DES
* CONTAINERS steht, wo jeder Nextcloud-Prozess und jeder, der sich
* hineinhängt, ihn aus der Umgebung auslesen kann.
*
* Der Wert bleibt im Argv der VM-Shell sichtbar, fuer die Dauer des
* Aufrufs: Debians `dash` (die Standard-Shell in den Kunden-VMs)
* optimiert den Elternprozess nicht weg, wie `bash` es täte.
* *
* EHRLICHERWEISE ist das Hygiene, kein Schutz: Nextcloud legt * EHRLICHERWEISE ist das Hygiene, kein Schutz: Nextcloud legt
* `mail_smtppassword` anschliessend im Klartext in config/config.php ab. * `mail_smtppassword` anschliessend im Klartext in config/config.php ab.

View File

@ -2,19 +2,20 @@
use App\Support\NextcloudOcc; use App\Support\NextcloudOcc;
it('setzt den Wert erst IM Container ein, nicht in der VM', function () { it('haelt den Wert aus dem occ-Aufruf heraus', function () {
$befehl = NextcloudOcc::commandExpandingEnv( $befehl = NextcloudOcc::commandExpandingEnv(
'config:system:set mail_smtppassword --value="$CLUPILOT_SMTP_PW"', 'config:system:set mail_smtppassword --value="$CLUPILOT_SMTP_PW"',
['CLUPILOT_SMTP_PW' => 'geheim'], ['CLUPILOT_SMTP_PW' => 'geheim'],
); );
// Das Geheimnis steht als Zuweisung da (die aeussere Shell reicht es // Der Wert steht als Zuweisung VOR dem docker-Aufruf (die aeussere Shell
// durch), aber der occ-Aufruf traegt nur den VARIABLENNAMEN — eingesetzt // reicht ihn durch), aber der occ-Aufruf selbst (ab `sh -c`) traegt nur
// wird er von der sh INNERHALB des Containers. // den VARIABLENNAMEN. Damit sitzt das Geheimnis nicht im Argv des
// Containers.
expect($befehl)->toContain("CLUPILOT_SMTP_PW='geheim'") expect($befehl)->toContain("CLUPILOT_SMTP_PW='geheim'")
->and($befehl)->toContain('-e CLUPILOT_SMTP_PW') ->and($befehl)->toContain('-e CLUPILOT_SMTP_PW')
->and($befehl)->toContain('sh -c') ->and($befehl)->toContain('sh -c')
// Entscheidend: hinter `php occ` steht der Name, nicht der Wert. // Entscheidend: ab `sh -c` (der Innenteil des Containers) steht nur der Name.
->and(substr($befehl, strpos($befehl, 'sh -c')))->not->toContain('geheim'); ->and(substr($befehl, strpos($befehl, 'sh -c')))->not->toContain('geheim');
}); });