Sicherheits-Schwachstelle in Keycloak < 21.0.1

Hallo liebe Portalbetreiber,

habt Ihr diesen hier auf dem Schirm?
https://wid.cert-bund.de/portal/wid/securityadvisory?name=WID-SEC-2023-0562

Viele Grüße,
Roland

2 „Gefällt mir“

@opatut @boldt

Leider ist der jboss keycloak container aus unserem compose file offenbar out of maintenance (letzter Push vor einem Jahr). Ich denke nach kurzer Lektüre der CVE die Lücke ist nicht so, dass sie einfach automatisiert nutzbar ist, von daher haben wir einen Augenblick Zeit, das zu überlegen, aber wir sollten auf einen maintainedten Keycloak umstellen.

2 „Gefällt mir“

Ich kümmere mich gerne darum.

2 „Gefällt mir“

Hi,
wie bist du darauf aufmerksam geworden? Schwachstellenscanner oder einfach nen Alert auf „Keycloak“?
Danke und Grüße
Markus

1 „Gefällt mir“

Wir setzen in der Firma ebenfalls Keycloak ein und kriegen solche Infos aus unserem Information Security Office.
Unser ISO „scannt“ jeden Tag die Security Mailinglisten und Newsticker.

Ah! Sehr gut. Einfacher wärs evtl. mit einem Schwachstellentool, aber da muss man Kosten und Nutzen abwägen. Super zu wissen, dass jemand das Thema Schwachstellen auf dem Radar hat und die Community informiert. Ich bin leider noch nicht dazu gekommen mich damit zu beschäftigen.

1 „Gefällt mir“

Stimme @gluap zu. Die Lücke lässt sich nur von einem bereits authentifizierten User ausnutzen. Was sie nicht weniger schlimm macht, aber sie lässt sich eben nicht ganz so einfach ausnutzen.

Vielleicht sollten wir im docker-cmpose.yaml das Image jboss/keycloak durch quay.io/keycloak/keycloak ersetzen. (vorherige Funktionstests stillschweigend vorausgesetzt)

Es gibt im Docker-Hub das Image keycloak/keycloak, das auch auf der offiziellen Keycloak-Website verlinkt ist: Docker
Wenn man umstellt, dann vermutlich sinnvollerweise auf das offizielle.

Ich glaube mitbekommen zu haben, dass im Updatepfad ein paar Breaking Changes drin sind (macht Keycloak wohl gerne). Da müsste man wohl mal die Changelogs ansehen, ob uns das bertrifft.

Hatte zuerst auch keycloak/keycloak gschrieben, dann aber gesehen, dass es auf Docker kein Verified Publisher ist und es dann auf quay.io/keycloak/keycloak abgeändert.

Später habe ich dann nochmal genauer geschaut und gesehen, dass beide Repositories identisch sind. Haben beide die gleichen Digest.

Hier für den letzten Nightly build AMD64.

https://quay.io/repository/keycloak/keycloak/manifest/sha256:e5c2f989d5a86a5f86fd290d45bb42dfeed975694fa05b69ff584f2a869b8650

https://hub.docker.com/layers/keycloak/keycloak/nightly/images/sha256-e5c2f989d5a86a5f86fd290d45bb42dfeed975694fa05b69ff584f2a869b8650?context=explore

1 „Gefällt mir“

Also testweise mit dem Docker image bekomme ich es zum Laufen. Derzeit nur im (nicht für production empfohelnen) dev mode probiert.

Notes:

  • Brauchte Dockerfile, diesem Tutorial gefolgt
    Meine Version (cert generierung auskommentiert weil wir reverse proxy nutzen und die Variablen raus genommen weil wir die per Docker-Compose und .env später setzen):
FROM quay.io/keycloak/keycloak:latest as builder

# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true

# Configure a database vendor
ENV KC_DB=postgres

WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
#RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build

FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/

# change these values to point to a running postgres instance
ENTRYPOINT ["/opt/keycloak/bin/kc.sh"]

Sektion aud dem compose file:

  keycloak:
    image: local_keycloak
    build:
      context: ./keycloak/
      dockerfile: Dockerfile
    ports:
      - 3003:8080
      - 8080:8080
    links:
      - postgres
    environment:
      KC_HOSTAME: localhost
      KC_DB_URL: jdbc:postgresql://$OBS_KEYCLOAK_POSTGRES_HOST/$OBS_KEYCLOAK_POSTGRES_DB
      KC_DB: $OBS_KEYCLOAK_POSTGRES_DB
      KC_DB_USERNAME: $OBS_KEYCLOAK_POSTGRES_USER
      KC_DB_PASSWORD: $OBS_KEYCLOAK_POSTGRES_PASSWORD
    volumes:
      - ./data/keycloak:/data
    command:
      - start-dev

Todo:

Achtung: erstmal nur reingeschaut, weiß nicht wann ich dazu komme weiter zu machen -gern jemand anders übernehmen

Hallo @gluap,
habe gestern mal versucht das Docker compose zu starten. Leider schlägt es fehlt. Schaue heute Abend nochmal genauer nach dem Fehler.

Bist du bei den Ports sicher? 8080 vom Container soll an zwei Ports nach außen gegeben werden? Der obere Eintrag war schon im Compose YAML enthalten, der untere kommt von deinem Post.

@SubOptimal das ist aus meinem lokalen Setup, da habe ich mal mit mehreren Ports gearbeitet.

GGF Müssen die ganzen $OBS_KEYCLOAK_XY ersetzt werden - ich hab auf dem testsetup noch ein älteres Compose file in dem die Variablen anders hießen und hab das on the fly übersetzt.

Mehr resultate:

  • Die well_known url vom neuen keycloak hat sich geändert: kein „/auth“ mehr in der Url.

Genau es gab mehrere größere Umbauten in den letzten Releases. Keycloak kann intern nun mittels (kc.bat/kc.sh) verwaltet werden und nutzt inzwischen unter der Haube Quarkus als Server (was z.B. unter Windows etwas herausfordernd ist).

Kein /auth hört sich komisch an, da KeyCloak doch Standard OAuth2 macht. Ich Keycloak bei anderen Projekten relativ problemlos hochziehen können, wenn man Version für Version updated.

Weil ichs oben nicht so klar geschrieben habe: folgende Änderung für den portal container in .env war bei mir nötig, damit der die .well-known gefunden hat:

# OBS_KEYCLOAK_URL=https://login.example.com/auth/realms/obs/ # alt und gammlig aus der example config
OBS_KEYCLOAK_URL = "http://keycloak:8080/realms/obs/" # für mit neuem keycloak

Ich hatte mit dem neuen Keycloak Image folgendes (für das Developer Setup aus der README) versucht, was aber nicht startet.

docker-compose up -d keycloak

Hattest Du das examples/docker-compose.yaml geändert?

Fehlrmeldung habe ich nicht parat, aber die ersten beiden angezeigten Punkte enden schon mit Fehler.

Ja, wie oben beschrieben:
Die Variablen, die keycloak/keycloak im Environment erwartet heißen alle anders als die die jboss/keyckoak erwartet hat.

  keycloak:
    image: local_keycloak
    build:
      context: ./keycloak/
      dockerfile: Dockerfile
    ports:
      - 3003:8080
      - 8080:8080
    links:
      - postgres
    environment:
      # kc_hostname ist der externe hostname - in meinem testsetup ist das localhost.
      KC_HOSTAME: localhost
      KC_DB_URL: jdbc:postgresql://${OBS_KEYCLOAK_POSTGRES_HOST}/${OBS_KEYCLOAK_POSTGRES_DB}
      KC_DB: ${OBS_KEYCLOAK_POSTGRES_DB}
      KC_DB_USERNAME: ${OBS_KEYCLOAK_POSTGRES_USER}
      KC_DB_PASSWORD: ${OBS_KEYCLOAK_POSTGRES_PASSWORD}
      KEYCLOAK_ADMIN=${OBS_KEYCLOAK_ADMIN_USER}
      KEYCLOAK_ADMIN_PASSWORD=${OBS_KEYCLOAK_ADMIN_PASSWORD}

    volumes:
      - ./data/keycloak:/data
    command:
      - start-dev

Alte Variablennamen:

  - DB_VENDOR=postgres
  - DB_ADDR=${OBS_KEYCLOAK_POSTGRES_HOST}
  - DB_DATABASE=${OBS_KEYCLOAK_POSTGRES_DB}
  - DB_USER=${OBS_KEYCLOAK_POSTGRES_USER}
  - DB_PASSWORD=${OBS_KEYCLOAK_POSTGRES_PASSWORD}
  # admin user
  - KEYCLOAK_USER=${OBS_KEYCLOAK_ADMIN_USER}
  - KEYCLOAK_PASSWORD=${OBS_KEYCLOAK_ADMIN_PASSWORD}

Ich habe auf GitHub ein Issue dafür aufgemacht

Eine angepasste Docker Compose Datei ist in der Branch issue_322.

Es sind noch Fehler vorhanden, die ich nicht fixen konnte.

1 „Gefällt mir“