Skriptsprache: Perl 5.28 ist entscheidend sicherer

In diesem Jahr bringt erst der Juni alles Neue in die Perlwelt, denn drei ernste Sicherheitslücken wollten zuvor zuverlässig geschlossen sein.

In Pocket speichern vorlesen Druckansicht 27 Kommentare lesen
Skriptsprache: Perl 5.26 ist sicherer und hat schönere reguläre Ausdrücke
Lesezeit: 4 Min.
Von
  • Herbert Breunung
Inhaltsverzeichnis

Erst im Juni gibt es wirklich Neues bei Perl: Die Perl Porter – also die Gruppe der Perl-Entwickler – um Sawyer X konzentrierten sich bei der Fertigstellung von Perl 5.28 darauf, Doppeldeutigkeiten und Problemquellen zu entfernen. Geplante, große Neuerung bei den Signaturen und Objekten erreichten noch nicht die erhoffte Reife und auch die Abschaffung der umstrittenen given/when-Befehle wurde letztlich revidiert.

Programmierfehler in der Logik, die reguläre Ausdrücke auswertet und über zu verwendende Zeichenkodierung entscheidet, ermöglichten es unbefugt Speicherbereiche auszulesen [CVE-2017-12883] oder das Programm abstürzen zu lassen [CVE-2017-12837].

Um ähnlichen Attacken vorbeugen zu können, wurde die Regex-Gruppe (*script_run: ...) oder kurz (*sr: ...) eingeführt, die einen Teilausdruck markiert, der nur auf einheitlich kodierte Zeichenketten passt. Zusätzlich informiert nun die Spezialvariable ${^SAFE_LOCALES} darüber, wann es sicher ist, regionale Kodierungen einzusetzen. Eine dritte Angriffsmöglichkeit betrifft lediglich Windows [CVE-2017-12814].

Die Kommandozeilenoption -i erlaubt es, mit einem Einzeiler Dateien zu überarbeiten. Wenn während dessen Perl abstürzte, wurde in Folge die Datei zerstört. Dies wird jetzt durch Anlegen einer Sicherheitskopie vermieden. Darüber hinaus wurden mehrere, nicht mehr als sicher geltende Hash-Funktionen außer Betrieb genommen.

Das Zusammenfügen von Zeichenketten und die Erzeugung von Suchmustern mit Unicode (\p{...}) wurde mit weniger Anweisungen umgesetzt. Auch die Befehle ref(), keys() und for()-Schleifen laufen ab jetzt schneller, da der Kontext eines Befehls nun effektiver ausgewertet werden kann. Eine Reihe kleinerer Regex-Anweisungen, den Umgang mit UTF-8 sowie glob haben die Perl Porter ebenfalls optimiert.

Neu und damit noch mindestens für die nächste Version experimentell sind alternative Bezeichnungen bekannter Kürzel in regulären Ausdrücken mit sprechenden Namen, welche die Lesbarkeit verbessern sollen. Zum Beispiel ließe sich anstatt (?=...) nun auch (*positive_lookahead:...) oder kurz (*pla:...) schreiben.

delete kann nun mehrere Werte aus einem Hash auf einmal löschen. Diese Aktion liefert eine Liste mit den betreffenden Schlüsseln und Werten.

Was für my selbstverständlich ist, funktioniert nun auch für lokale Variablen, die sich ihre Inhalte merken. Arrays und Hashes können mit Literalangaben initialisiert werden, wie etwa:

state @a = qw(x y z);

state-Variablen müssen hingegen weiterhin einzeln deklariert werden.

Zu den Neuerungen gehört auch eine Liste von Verboten. Die wichtigsten betreffen zum Einen die heredocs. Möchte man unbedingt auf eine Markierung des Endes verzichten, so muss man explizit angeben, dass die leere Zeichenkette (Zeile ohne Einrückung), den heredoc-String beendet.

my $text = <<'';
Dies ist ein schlauer Text

Wer die experimentellen Signaturen und Prototypen auf einmal verwenden will, muss es nun genau in der Reihenfolge tun (erst die Signatur). Variablen innerhalb von Formaten müssen durch Komma getrennt werden.

Wie zu erwarten, wurde der Unicode-10.0-Standard aufgenommen, inklusive einem Zeichen für Bitcoin und der Möglichkeit Emojis eine selbstgewählte Frisur zu verpassen. Wie angekündigt, sind die mit 5.22 eingeführten, zeichenweise arbeitenden, logischen Operatoren (&. |. ^. ~.) nicht mehr experimentell. Sie werden mit einem einfachen use v5.28; mit freigeschaltet. Warnmeldungen, welche die Verwendung veralteter Ausdrücke anmahnen, enthalten nun auch die Angabe, wann der Ausdruck entfernt werden soll. Laut perlpolicy gibt es mindestens zwei Versionen Karenzzeit, aber die exakte Planung, wann welche Funktionalität verschrottet wird, ist im Dokument perldeprecation verzeichnet. Insgesamt wurden 21 solcher Seiten der Dokumentation für 5.28 erneuert, inklusive der perldelta, die alle Änderungen enthält. (map)