FHEM Forum

FHEM - Hausautomations-Systeme => Unterstützende Dienste => Thema gestartet von: Jamo am 20 Oktober 2024, 19:43:09

Titel: XiaomiDevice & Crypt/CBC.pm lässt fhem abstürzen
Beitrag von: Jamo am 20 Oktober 2024, 19:43:09
Hi,
ich habe einen Xiaomi VacuumCleaner, der als XiaomiDevice eingebunden ist.
defmod wall_e XiaomiDevice 172.21.0.18 12345678abcd1234567812345678efghBeim starten des Cleaners, ich glaube wenn er noch nicht ganz mit dem WLAN verbunden ist (ich schalte im Urlaub die Steckdose des Saugroboters aus) stürzt fhem mit folgender Fehlermeldung ab:

ZitatFATAL: input size not equal to blocksize (16) at /usr/share/perl5/Crypt/CBC.pm line 492.

sub _cbc_decrypt {
    my $self = shift;
    my ($crypt,$iv,$result,$blocks) = @_;
    # the copying looks silly, but it is slightly faster than dereferencing the
    # variables each time
    my ($i,$r) = ($$iv,$$result);
    foreach (@$blocks) {
        $r    .= $i ^ $crypt->decrypt($_);  # ZEILE 492
        $i     = $_;
    }
    ($$iv,$$result) = ($i,$r);
}

Weiss jemand wie ich den Absturz verhindern kann? Ich habe versucht, die Zeile 492 mit eval zu klammern, um den Absturz zu verhindern, aber das funktioniert auch nicht.
$r    .= eval($i ^ $crypt->decrypt($_));
Titel: Aw: XiaomiDevice & Crypt/CBC.pm lässt fhem abstürzen
Beitrag von: rudolfkoenig am 20 Oktober 2024, 23:04:15
Meiner Ansicht nach gehoert das im FHEM/72_XiaomiDevice.pm gefixt.

Ich gehe davon aus, dass $cbc->decrypt_hex($data) nur mit einem sinnvollen Datenlaenge aufgerufen werden darf (z.Bsp. length($data) % 32 == 0),
und sowas kann man im FHEM Modul vor dem Aufruf pruefen. Da ich kein Geraet habe, habe ich das nicht getestet.
Titel: Aw: XiaomiDevice & Crypt/CBC.pm lässt fhem abstürzen
Beitrag von: Jamo am 22 Oktober 2024, 20:46:20
Hallo Rudolf,
danke, das scheint zu funktionieren. Ich habe in 72_XiaomiDevice.pm, die Zeile mit decrypt_hex vorher auf eine sinnvolle Datenlaenge geprüft. Also
my $return = $cbc->decrypt_hex($data);mit deinem Vorschlag abgeprüft.my $return = 00000000000000000000000000000000;
if(length($data)%32 == 0) {
$return = $cbc->decrypt_hex($data);}
Falls ich nochmal in einen fhem Absturz komme, würde ich mich nochmal bei Dir melden.

Danke!