File kget43_CVE-2010-1000-r1126227.diff of Package kdenetwork4
Index: kget/transfer-plugins/metalink/metalinker.h
===================================================================
--- kget/transfer-plugins/metalink/metalinker.h (revision 1126226)
+++ kget/transfer-plugins/metalink/metalinker.h (working copy)
@@ -1,6 +1,7 @@
/* This file is part of the KDE project
Copyright (C) 2007 Manolo Valdes <nolis71cu@gmail.com>
+ Copyright (C) 2010 Matthias Fuchs <mat69@gmx.net>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
@@ -18,6 +19,14 @@ class MlinkFileData
{
public:
MlinkFileData() {}
+
+ /**
+ * Controlls if the name attribute is valid, i.e. it is not empty and
+ * does not contain any directory traversal directives or information
+ * In case of faulty fileNames the MlinkFile gets discarded
+ */
+ bool isValidNameAttribute() const;
+
QString fileName;
QString md5;
QString sha256;
Index: kget/transfer-plugins/metalink/metalinker.cpp
===================================================================
--- kget/transfer-plugins/metalink/metalinker.cpp (revision 1126226)
+++ kget/transfer-plugins/metalink/metalinker.cpp (working copy)
@@ -1,6 +1,7 @@
/* This file is part of the KDE project
Copyright (C) 2007 Manolo Valdes <nolis71cu@gmail.com>
+ Copyright (C) 2010 Matthias Fuchs <mat69@gmx.net>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
@@ -16,6 +17,23 @@
#include <QDomElement>
+bool MlinkFileData::isValidNameAttribute() const
+{
+ if (fileName.isEmpty()) {
+ kError(5001) << "Name attribute of Metalink::File is empty.";
+ return false;
+ }
+
+ QStringList components = fileName.split('/');
+
+ if (fileName.startsWith("/") || components.contains("..")) {
+ kError(5001) << "Name attribute of Metalink::File contains directory traversal directives:" << fileName;
+ return false;
+ }
+
+ return true;
+}
+
Metalinker::Metalinker()
{
}
@@ -36,12 +54,24 @@ QList<MlinkFileData> Metalinker::parseMe
kDebug(5001) << files.length() << " <file> tags found";
+ QStringList fileNames;
for( uint i=0 ; i < files.length() ; ++i )
{
QDomNode file = files.item(i);
MlinkFileData data;
- data.fileName = file.toElement().attribute("name");
+ data.fileName = QUrl::fromPercentEncoding(file.toElement().attribute("name").toAscii());
kDebug(5001) << "filename: "<< data.fileName;
+ if (!data.isValidNameAttribute()) {
+ fileData.clear();
+ return fileData;
+ }
+
+ if (fileNames.contains(data.fileName)) {
+ kError(5001) << "Metalink::File name" << data.fileName << "exists multiple times.";
+ fileData.clear();
+ return fileData;
+ }
+ fileNames << data.fileName;
QDomNodeList hashes = file.toElement().
elementsByTagName("verification").