
Sicherheitsforschungs-Labor, das CVE-2020-36762 (GHSA-h9gr-83jq-f3xc) reproduziert: Bash-Befehlsinjektion über github.event.comment.body im Kommentar-Workflow von ONSdigital/ras-collection-instrument
Automatisiertes Forschungsobjekt – nicht das Upstream-Projekt.
Dieses Repository ist ein Wegwerf-Labor, das von einer automatisierten Testumgebung für eine Masterarbeit an der Université Laval zur Reproduktion veröffentlichter GitHub-Actions-Workflow-Schwachstellen erstellt wurde. Es ist eine wörtliche Momentaufnahme von
ONSdigital/ras-collection-instrumentbeim Commit493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03), weiterverbreitet unter der eigenen Lizenz des Projekts, deren Datei unverändert in dieser Momentaufnahme enthalten ist.Das Upstream-Projekt ist nicht beteiligt, wird niemals angegriffen, und die hier untersuchte Schwachstelle ist bereits öffentlich bekannt. Jedes Geheimnis und jede Variable in diesem Repository ist ein zufällig generierter Dummy-Wert – es sind keine echten Anmeldedaten vorhanden. Aktionsreferenzen und Runner-Images sind auf den Stand vom 2020-12-03 fixiert; siehe
pinning.mdin der Testumgebungs-Ausgabe für jede an der Momentaufnahme vorgenommene Änderung.Fragen oder Einwände: [email protected]
Dies ist der Microservice RAS Collection Instrument, der für das Hochladen von Erhebungsdurchführungen und Erhebungsinstrumenten zuständig ist. Er kann auch verwendet werden, um Erhebungsinstrumente als .xlsx-Dateien herunterzuladen, und ermöglicht die Suche nach Erhebungsinstrumenten über Suchfilter. Dieser Dienst kann Erhebungsdurchführungen mit Erhebungsinstrumenten verknüpfen und die Verknüpfung aufheben. Die Beziehung zwischen Durchführungen und Instrumenten ist eins-zu-viele, sodass eine Erhebungsdurchführung mehrere Erhebungsinstrumente haben kann. Jedes Erhebungsinstrument im JSON-Schema hat eine Stichprobeneinheiten-Referenz, einen Typ und eine Zusammenfassungs-ID sowie zusätzliche Attribute. Dieser Dienst kommuniziert hauptsächlich mit dem Erhebungsdurchführungs-Dienst sowie mit den Diensten für Parteien, Fälle und Umfragen. Protokollinformationen über die Erhebungsinstrumente werden an rabbitmq gesendet.
Erhebungsinstrumente werden in einer Instrumententabelle mit den folgenden Feldern gespeichert:
type = der Typ der Erhebungsdurchführung (z. B. SEFT, EQ usw.) instrument_id = die UUID für das Instrument stamp = der Zeitstempel, der angibt, wann das Erhebungsinstrument erstellt wurde survey_id = die UUID der zugehörigen Umfrage classifiers = die Umfrage-Klassifikatoren survey = die Umfrage selbst seft_file = die SEFT-Datei des Instruments
Es gibt drei verschiedene Endpunkt-Ansichten: /collectioninstrument, die für die meisten Endpunkte verwendet wird, sowie /survey_responses und /info.
Wenn ein Erhebungsinstrument für eine Erhebungsdurchführung hochgeladen wird, schreibt es eine Nachricht in die Seft.Instruments-Warteschlange für den rm-collection-exercise-Dienst. Wenn eine SEFT-Umfrageantwort hochgeladen wird, schreibt es eine Nachricht in die Seft.Responses-Warteschlange für den sdx-seft-consumer-Dienst.
Hierfür muss pipenv installiert sein:
pip install pipenv
Zum Ausführen der Tests werden ein rabbitmq- und ein Datenbankserver benötigt. Das tox-Skript erstellt und startet diese Abhängigkeiten in Docker-Containern, die nach dem Ausführen der Unit-Tests wieder zerstört werden.
pipenv install --dev
pipenv run tox
Zum Ausführen des Dienstes mit den erforderlichen Abhängigkeiten:
docker-compose up -d db rabbitmq
pipenv run python run.py
Zum Testen, ob der Dienst läuft:
curl http://localhost:8082/info
Die Datenbank wird beim Starten der Anwendung automatisch erstellt.
Zum Ausführen des Dienstes in einem Docker-Container ist ein Compose-Skript enthalten:
docker-compose up -d
Die für die Konfiguration verfügbaren Umgebungsvariablen sind unten aufgeführt:
| Umgebungsvariable | Beschreibung | Standard |
|---|---|---|
| MAX_UPLOAD_FILE_NAME_LENGTH | Maximale Länge von Dateinamen | 50 |
| LOGGING_LEVEL | Stufe des Loggers | INFO |
| JSON_SECRET_KEYS | JSON-Darstellung von Schlüsseln | None |
| ONS_CRYPTOKEY | Ein Schlüssel, der vom Cryptographer verwendet wird | None |
| SECURITY_USER_NAME | Benutzername, mit dem sich der Client bei anderen APIs authentifiziert | admin |
| SECURITY_USER_PASSWORD | Passwort, mit dem sich der Client bei anderen APIs authentifiziert | secret |
| COLLECTION_EXERCISE_SCHEMA | Speicherort des Erhebungsinstrument-Schemas | application/schemas/collection_instrument_schema.json |
| CASE_URL | URL für den Fall-Dienst | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | URL für den Erhebungsdurchführungs-Dienst | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | URL für den Umfrage-Dienst | 'http://localhost:8080' |
| PARTY_URL | URL für den Parteien-Dienst | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | URI für rabbitmq | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | URI für rabbitmq | None |
Diese werden in config.py festgelegt.
Navigieren Sie zu /developer_scripts und führen Sie import.py aus, beantworten Sie die Eingabeaufforderungen in der Befehlszeile.
collection_instrument_schema hat zwei scheinbar identische Attributfelder: formType und formtype.entname1/2/3 und runame1/2/3, unter anderem. Das Schema sollte neu gestaltet oder besser dokumentiert werden./collectioninstrument/count lediglich die Anzahl der Erhebungsinstrumente zurück. Warum muss der Dienst das tun? Könnte dies nicht durch eine Datenbankabfrage erreicht werden?