h1

Net::SSH::Perl und known_hosts

21. April 2008

Bei der Verwendung des Perl Moduls Net::SSH-Perl tritt folgendes Problem auf:

Eine Verbindung zu einem Host mit SSH1 erzeugt die folgende Meldung:

Argument "ssh-rsa" isn't numeric in numeric eq (==) at modules/Net/SSH/Perl/Key/RSA1.pm line 103, <FH> line 23.

Nach längerem Suchen entdeckte ich, dass das Modul Hosts.PM die Methode equal aus dem Modul RSA1.pm verwenden. Dabei wird folgende Ausgabe erzeugt, wenn man das Modul RSA1 kurzfristig umschreibt wie folgt:

sub equal {
my($keyA, $keyB) = @_;
print "$keyA->{rsa}
$keyB->{rsa}
bitsA: $keyA->{rsa}{bits}
bitsB: $keyB->{rsa}{bits}
keyA: $keyA->{rsa}{n}
keyB: $keyB->{rsa}{n}
$keyA->{rsa}{e}
$keyB->{rsa}{e}\n";
$keyA->{rsa} && $keyB->{rsa} &&
$keyA->{rsa}{bits} == $keyB->{rsa}{bits} &&
$keyA->{rsa}{n} == $keyB->{rsa}{n} &&
$keyA->{rsa}{e} == $keyB->{rsa}{e};
}

Ausgabe:

Use of uninitialized value in concatenation (.) or string at modules/Net/SSH/Perl/Key/RSA1.pm line 95, <FH> line 23.
HASH(0x96fe78)
HASH(0x9659e4)
bitsA: 768
bitsB: ssh-rsa
keyA: 1295114094267464959040618524315923090715719842401896780056623074041026914313434353851674959103867550024637278939333976156853100989243816594892986096194402545568572126024189142175098585647756961269395154835682416927930811763277092609
keyB:
35
AAAAB3NzaC1yc2EAAAABIwAAAGEAoDtFmzlg44nJ6JdBs218W3xUmR1TXvTpQYLnAn6djlQPj2d6+Ev0nPObZ0cucvyRqanlkcT4XI6CmKozv4+7v5X3NxLMxA82llPqBQJFUJx+pHJYkOiKiP1cAtI0wXu1
Argument "ssh-rsa" isn't numeric in numeric eq (==) at modules/Net/SSH/Perl/Key/RSA1.pm line 103, <FH> line 23.
HASH(0x96fe78)
HASH(0x952f74)
bitsA: 768
bitsB: 768
keyA: 1295114094267464959040618524315923090715719842401896780056623074041026914313434353851674959103867550024637278939333976156853100989243816594892986096194402545568572126024189142175098585647756961269395154835682416927930811763277092609
keyB: 1295114094267464959040618524315923090715719842401896780056623074041026914313434353851674959103867550024637278939333976156853100989243816594892986096194402545568572126024189142175098585647756961269395154835682416927930811763277092609
35
35

Weitere Recherchen ergaben, dass hier die Datei .ssh/known_hosts gelesen wurde, und diese erlaubt laut man sshd zwei verschiedene Formate:

Examples
closenet,…,130.233.208.41 1024 37 159…93 closenet.hut.fi
cvs.openbsd.org,199.185.137.3 ssh-rsa AAAA1234…..=

Net::SSH::Perl kommt aber mit zweiterem nicht zurecht!

Workarund: In meinem konkreten Fall möchte ich den Hostcheck komplett deaktivieren, um das Perl-Skript von der SSH-Konfig des Hosts vollkommen unabhängig zu machen. Das erreiche mit einem einzigen # an der richtigen Stelle des SSH1.pm:

    $ssh->{session}{id} = $session_id;
# disabled von Ingo: $ssh->check_host_key($keys{host});
my $session_key = join '', map chr rand(255), 1..32;

Die Security-Implications sind hoffentlich klar: Es findet keine Überprüfung mehr statt, ob der kontaktierte Host nicht in irgend einer Form gespooft ist. Die Verbindung wird ohne Warnung und Prüfung aufgebaut und das Passwort übertragen! Nameresolution und Routing tragen somit die gesamte Verantwortung für die Vertraulichkeit des Passwortes. (Bei automatisierten Scripts in einer an sich gesicherten Umgebung erscheint mir das vertretbar)

http://rt.cpan.org/Public/Bug/Display.html?id=25175

Advertisements

One comment

  1. adding protocal version helped me resolve the error
    my $ssh = Net::SSH::Perl->new($host, %args,protocol=>’2,1′);



Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: