802.1X, Android und Endlosschleifen

Bei mir am Institut betreiben wir unser WLAN – wie so viele Andere in der Welt – mit RADIUS-gestützter 802.1X Authentifizierung und WPA2 Verschlüsselung. Das funktioniert inzwischen wunderbar mit allen Betriebssystemen, ein Zustand, der durchaus schön ist, bedenkt man doch wie schwer es in den Anfangszeiten teilweise war, Systemen 802.1X beizubringen.

Nun haben wir auf Android Geräten ein interessantes Verhalten bemerkt. Teilweise kommt es zu Fehlern beim Verbindungsaufbau mit dem WLAN, insbesondere bei der Authentifikation mit 802.1X. Die Geräte verbinden sich, authentifizieren sich und brechen den Vorgang ab, nur um das ganze in ewiger Schleife zu wiederholen, mehrfach in der Sekunde. Dabei springen sie sogar von Accesspoint zu Accesspoint. Das Problem tritt bei verschiedensten Geräten auf, augenscheinliche Gemeinsamkeiten gibt es nicht wirklich. Die Android Version ist da ebenso insignifikant gewesen wie das verwendete ROM (müsste es nicht eigentlich im Geiste von Linux auch bei Android „Distribution“ heißen?!).

Ich habe den Fehler lange nicht zu fassen bekommen, aber gestern wurde es mir zu doof, ich habe mir die Sourcen vom wpa_supplicant und vom Linux-Kernel geschnappt und habe das Problem bis zum ioctl herunter verfolgt, wo das Problem entsteht. Dabei viel mir auf, dass an genau dieser Stelle weder etwas mit WPA/WPA2 noch mit 802.1X geschieht, sondern der WLAN-Hardware ein WEP Schlüssel mitgeteilt werden soll. Genau das schlägt fehl.

Aus drivers/staging/brcm80211/brcmfmac/wl_cfg80211.c, Funktion wl_cfg80211_config_default_key:

if (wsec & WEP_ENABLED) {
    /* Just select a new current key */
    index = (u32) key_idx;
    index = htod32(index);
    err = wl_dev_ioctl(dev, WLC_SET_KEY_PRIMARY, &index,
            sizeof(index));
    if (unlikely(err)) {
        WL_ERR(("error (%d)\n", err));
    }
}

Der rot markierte Call ist das Problem. Nun gehört das File ja zum Broadcom Treiber, und die verwendete Kernelversion ist auch nicht die aktuellste, aber ich kann auf meine APs schneller einwirken als auf den Kernel meines Telefons. Aber viel wichtiger: WEP fällt eh in die Kategorie „muß schnell weg“, daher habe ich die APs im ganzen Institut umkonfiguriert und habe die als Fallback für hoffnungslos veraltete Geräte noch aktivierte WEP Option endgültig abgeschaltet. Und siehe da, die Android Geräte hatten auf einmal keine Probleme mehr mit WPA2 und 802.1X.

Ich nehme an, daß es sich um ein aktives Probing von Cryptofähigkeiten der aktuellen SSID handelt, aber ich kann mich da auch vertun – ich hatte wenig Motivation mich noch tiefer in die Kernelsourcen einzugraben. Zumindestens habe ich die Quelle dieses Problems gefunden und eliminiert. Dieser Fehler scheint anderswo auch aufgtetreten zu sein, ich habe diverse Verweise auf vergleichbares Verhalten von Adroid Geräten im Netz gefunden, aber nie eine hilfreiche Lösung. Vielleicht findet ja der eine oder andere diesen Artikel und spart sich so harte Detektivarbeit auf tiefster Systemebene.

Wenigstens geben mir solche Erfolge immer wieder mal das Gefühl, doch den richtigen Beruf eingeschlagen zu haben. 😉