Package: ktorrent
Version: 2.1-1~mdx1
Severity: grave
Tags: patch security
Justification: user security hole

I came across this piece of news:
http://www.heise-security.co.uk/news/86661 which explains very briefly
about two security issues in ktorrent. These have been solved on
ktorrent 2.1.2 as explained on http://ktorrent.org/forum/viewtopic.php?t=1401

I know the frozen version is 2.0.3 which is somewhat "far" from the
fixed version, so I looked into the svn 
respository(svn://anonsvn.kde.org/home/kde/trunk/extragear/network/ktorrent) 
and found that commit 640661 fixes the bug. I also attach it as patch,

I hope it could apply cleanly to the frozen version.

Thanks.

-- System Information:
Debian Release: 4.0
  APT prefers unstable
  APT policy: (800, 'unstable'), (500, 'testing'), (100, 'experimental')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: Linux 2.6.20rs
Locale: LANG=es_ES.UTF-8, LC_CTYPE=es_ES.UTF-8 (charmap=UTF-8)

Versions of packages ktorrent depends on:
ii  kdelibs4c2a          4:3.5.6.r1.dfsg.1-2 core libraries and binaries for al
ii  libacl1              2.2.42-1            Access control list shared library
ii  libart-2.0-2         2.3.17-1            Library of functions for 2D graphi
ii  libattr1             1:2.4.32-1.1        Extended attribute shared library
ii  libaudio2            1.8-3               The Network Audio System (NAS). (s
ii  libavahi-client3     0.6.16-3            Avahi client library
ii  libavahi-common3     0.6.16-3            Avahi common library
ii  libc6                2.3.6.ds1-13        GNU C Library: Shared libraries
ii  libfontconfig1       2.4.2-1.2           generic font configuration library
ii  libfreetype6         2.2.1-5             FreeType 2 font engine, shared lib
ii  libgamin0 [libfam0]  0.1.8-1             Client library for the gamin file 
ii  libgcc1              1:4.1.1-21          GCC support library
ii  libgmp3c2            2:4.2.1+dfsg-4      Multiprecision arithmetic library
ii  libice6              1:1.0.1-2           X11 Inter-Client Exchange library
ii  libidn11             0.6.5-1             GNU libidn library, implementation
ii  libjpeg62            6b-13               The Independent JPEG Group's JPEG 
ii  libpcre3             6.7-1               Perl 5 Compatible Regular Expressi
ii  libpng12-0           1.2.15~beta5-1      PNG library - runtime
ii  libqt3-mt            3:3.3.7-3           Qt GUI Library (Threaded runtime v
ii  libsm6               1:1.0.1-3           X11 Session Management library
ii  libstdc++6           4.1.1-21            The GNU Standard C++ Library v3
ii  libx11-6             2:1.0.3-6           X11 client-side library
ii  libxcursor1          1.1.7-4             X cursor management library
ii  libxext6             1:1.0.1-2           X11 miscellaneous extension librar
ii  libxft2              2.1.8.2-8           FreeType-based font drawing librar
ii  libxi6               1:1.0.1-4           X11 Input extension library
ii  libxinerama1         1:1.0.1-4.1         X11 Xinerama extension library
ii  libxrandr2           2:1.1.0.2-5         X11 RandR extension library
ii  libxrender1          1:0.9.1-3           X Rendering Extension client libra
ii  libxt6               1:1.0.2-2           X11 toolkit intrinsics library
ii  zlib1g               1:1.2.3-13          compression library - runtime

ktorrent recommends no packages.

-- no debconf information
Index: libktorrent/torrent/torrent.cpp
===================================================================
--- libktorrent/torrent/torrent.cpp	(revisión: 640660)
+++ libktorrent/torrent/torrent.cpp	(revisión: 640661)
@@ -163,9 +163,15 @@
 				if (!v || v->data().getType() != Value::STRING)
 					throw Error(i18n("Corrupted torrent!"));
 	
-				path += v->data().toString(encoding);
-				if (j + 1 < ln->getNumChildren())
-					path += bt::DirSeparator();
+				QString sd = v->data().toString(encoding);
+				// check for weirdness like .. ,
+				// we don't want to write outside the user specified directories
+				if (sd != "..") 
+				{
+					path += sd;
+					if (j + 1 < ln->getNumChildren())
+						path += bt::DirSeparator();
+				}
 			}
 
 			// we do not want empty dirs
Index: libktorrent/torrent/chunkcounter.cpp
===================================================================
--- libktorrent/torrent/chunkcounter.cpp	(revisión: 640660)
+++ libktorrent/torrent/chunkcounter.cpp	(revisión: 640661)
@@ -59,12 +59,13 @@
 
 	void ChunkCounter::inc(Uint32 idx)
 	{
-		cnt[idx]++;
+		if (idx < cnt.size())
+			cnt[idx]++;
 	}
 		
 	void ChunkCounter::dec(Uint32 idx)
 	{
-		if (cnt[idx] > 0)
+		if (idx < cnt.size() && cnt[idx] > 0)
 			cnt[idx]--;
 	}
 		
Index: libktorrent/torrent/peer.cpp
===================================================================
--- libktorrent/torrent/peer.cpp	(revisión: 640660)
+++ libktorrent/torrent/peer.cpp	(revisión: 640661)
@@ -193,11 +193,21 @@
 				{
 					Out() << "len err HAVE" << endl;
 					kill();
-					return;
 				}
-				
-				haveChunk(this,ReadUint32(tmp_buf,1));
-				pieces.set(ReadUint32(tmp_buf,1),true);
+				else
+				{
+					Uint32 ch = ReadUint32(tmp_buf,1);
+					if (ch < pieces.getNumBits())
+					{
+						haveChunk(this,ch);
+						pieces.set(ch,true);
+					}
+					else
+					{
+						Out(SYS_CON|LOG_NOTICE) << "Received invalid have value, kicking peer" << endl;
+						kill();
+					}
+				}
 				break;
 			case BITFIELD:
 				if (len != 1 + pieces.getNumBytes())
Index: apps/ktorrent/main.cpp
===================================================================
--- apps/ktorrent/main.cpp	(revisión: 640660)
+++ apps/ktorrent/main.cpp	(revisión: 640661)
@@ -108,6 +108,7 @@
 	about.addCredit("Dagur Valberg Johannsson",I18N_NOOP("Coldmilk webgui"),"[EMAIL PROTECTED]");
 	about.addCredit("Alexander Dymo",I18N_NOOP("IDEAl code from KDevelop"),"[EMAIL PROTECTED]");
 	about.addCredit("Scott Wolchok",I18N_NOOP("Conversion speed improvement in ipfilter plugin"),"[EMAIL PROTECTED]");
+	about.addCredit("Bryan Burns of Juniper Networks",I18N_NOOP("Discovered 2 security vulnerabilities (both are fixed)"),0);
 
 	KCmdLineArgs::init(argc, argv, &about);
 	KCmdLineArgs::addCmdLineOptions(options);

Reply via email to