public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* Re: More modutils: It's probably worse.
       [not found] ` <Pine.LNX.4.21.0011132352550.31869-100000@dione.ids.pl>
@ 2000-11-14  8:59   ` Olaf Kirch
  2000-11-14 10:04     ` David Schleef
                       ` (2 more replies)
  0 siblings, 3 replies; 13+ messages in thread
From: Olaf Kirch @ 2000-11-14  8:59 UTC (permalink / raw)
  To: Michal Zalewski; +Cc: BUGTRAQ, linux-kernel

On Tue, Nov 14, 2000 at 12:06:32AM +0100, Michal Zalewski wrote:
> Maybe I am missing something, but at least for me, modprobe
> vulnerabilities are exploitable via privledged networking services,
> nothing more.

Maybe not. ncpfs for instance has an ioctl that seems to allow
unprivileged users to specify a character set (codepage in m$speak)
that's requested via load_nls(), which in turn does a

	sprintf(buf, "nls_%s", codepage);
	request_module(buf);

Yummy.

The vfat file system contains code to obtain the charset name from
the media. Currently, the charset name is always "cp<number>", but
who knows, maybe next month will see another Microsoft extension to
ISO9660 that lets you specify an NLS name as a string?

Everyone is fixing modutils right now. Fine, but what about next
year's modutils rewrite?

This is why I keep repeating over and over again that we should make
sure request_module _does_not_ accept funky module names. Why allow
people to shoot themselves (and, by extension, all other Linux users
out there) in the foot?

Olaf

PS: The load_nls code tries to check for buffer overflows, but
    gets it wrong:

	struct nls_table *nls;
	char	buf[40];

	if (strlen(charset) > sizeof(buf) - sizeof("nls_"))
		fail;
	sprintf(buf, "nls_%s", charset);

    This will accept charset names of up to 35 characters,
    because sizeof("nls_") is 5. This gives you a single NUL byte
    overflow. Whether it's dangerous or not depends on whether your
    compiler reserves stack space for the *nls pointer or not...

-- 
Olaf Kirch         |  --- o --- Nous sommes du soleil we love when we play
okir@monad.swb.de  |    / | \   sol.dhoop.naytheet.ah kin.ir.samse.qurax
okir@caldera.de    +-------------------- Why Not?! -----------------------
         UNIX, n.: Spanish manufacturer of fire extinguishers.            
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14  8:59   ` More modutils: It's probably worse Olaf Kirch
@ 2000-11-14 10:04     ` David Schleef
  2000-11-14 10:29     ` Guest section DW
  2000-11-14 19:20     ` Ben Ford
  2 siblings, 0 replies; 13+ messages in thread
From: David Schleef @ 2000-11-14 10:04 UTC (permalink / raw)
  To: Olaf Kirch; +Cc: Michal Zalewski, BUGTRAQ, linux-kernel

On Tue, Nov 14, 2000 at 09:59:22AM +0100, Olaf Kirch wrote:
> On Tue, Nov 14, 2000 at 12:06:32AM +0100, Michal Zalewski wrote:
> > Maybe I am missing something, but at least for me, modprobe
> > vulnerabilities are exploitable via privledged networking services,
> > nothing more.
> 
> Maybe not. ncpfs for instance has an ioctl that seems to allow
> unprivileged users to specify a character set (codepage in m$speak)
> that's requested via load_nls(), which in turn does a
> 
> 	sprintf(buf, "nls_%s", codepage);
> 	request_module(buf);
> 
> Yummy.

Then it looks like the driver is broken, not modutils.


> Everyone is fixing modutils right now. Fine, but what about next
> year's modutils rewrite?
> 
> This is why I keep repeating over and over again that we should make
> sure request_module _does_not_ accept funky module names. Why allow
> people to shoot themselves (and, by extension, all other Linux users
> out there) in the foot?

Although I agree that having request_module() do a sanity check
is the best place to do a sanity check, I think it should be
up to the driver to not be stupid.  The drivers are trusted with
copy_to/from_user(), so why can't they be trusted to not pass
bad strings.

An inline function module_name_sanity_check() would be convenient
for those cases where "it is just necessary."

Rogue request_module() calls are bad in general, not only because
they might have dangerous invalid strings, but also because they
might have dangerous _valid_ strings.  I can imagine a
not-too-unlikely scenario where repeatedly loading a module
causes a DoS.




dave...


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14  8:59   ` More modutils: It's probably worse Olaf Kirch
  2000-11-14 10:04     ` David Schleef
@ 2000-11-14 10:29     ` Guest section DW
  2000-11-14 10:38       ` Olaf Kirch
  2000-11-14 19:20     ` Ben Ford
  2 siblings, 1 reply; 13+ messages in thread
From: Guest section DW @ 2000-11-14 10:29 UTC (permalink / raw)
  To: Olaf Kirch, Michal Zalewski; +Cc: BUGTRAQ, linux-kernel

On Tue, Nov 14, 2000 at 09:59:22AM +0100, Olaf Kirch wrote:

> PS: The load_nls code tries to check for buffer overflows, but
>     gets it wrong:
> 
> 	struct nls_table *nls;
> 	char	buf[40];
> 
> 	if (strlen(charset) > sizeof(buf) - sizeof("nls_"))
> 		fail;
> 	sprintf(buf, "nls_%s", charset);
> 
>     This will accept charset names of up to 35 characters,
>     because sizeof("nls_") is 5. This gives you a single NUL byte
>     overflow. Whether it's dangerous or not depends on whether your
>     compiler reserves stack space for the *nls pointer or not...

Where is the overflow? If charset has 35 characters then
	sprintf(buf, "nls_%s", charset);
writes 40 bytes into buf, and that fits.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14 10:29     ` Guest section DW
@ 2000-11-14 10:38       ` Olaf Kirch
  0 siblings, 0 replies; 13+ messages in thread
From: Olaf Kirch @ 2000-11-14 10:38 UTC (permalink / raw)
  To: Guest section DW; +Cc: Olaf Kirch, Michal Zalewski, BUGTRAQ, linux-kernel

On Tue, Nov 14, 2000 at 11:29:26AM +0100, Guest section DW wrote:
> Where is the overflow? If charset has 35 characters then
> 	sprintf(buf, "nls_%s", charset);
> writes 40 bytes into buf, and that fits.

Duh. You're right. Stupid me.

Sorry for the confusion.

Olaf
-- 
Olaf Kirch         |  --- o --- Nous sommes du soleil we love when we play
okir@monad.swb.de  |    / | \   sol.dhoop.naytheet.ah kin.ir.samse.qurax
okir@caldera.de    +-------------------- Why Not?! -----------------------
         UNIX, n.: Spanish manufacturer of fire extinguishers.            
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
@ 2000-11-14 12:47 Petr Vandrovec
  0 siblings, 0 replies; 13+ messages in thread
From: Petr Vandrovec @ 2000-11-14 12:47 UTC (permalink / raw)
  To: David Schleef; +Cc: Michal Zalewski, BUGTRAQ, linux-kernel

On 14 Nov 00 at 2:04, David Schleef wrote:
> On Tue, Nov 14, 2000 at 09:59:22AM +0100, Olaf Kirch wrote:
> > On Tue, Nov 14, 2000 at 12:06:32AM +0100, Michal Zalewski wrote:
> > > Maybe I am missing something, but at least for me, modprobe
> > > vulnerabilities are exploitable via privledged networking services,
> > > nothing more.
> > 
> > Maybe not. ncpfs for instance has an ioctl that seems to allow
> > unprivileged users to specify a character set (codepage in m$speak)
> > that's requested via load_nls(), which in turn does a

> Then it looks like the driver is broken, not modutils.

Well, you can use this ioctl only before ncp filesystem gets to life,
but yes, as this call is always done by mount process, I'll add

if (!capable(CAP_SYS_ADMIN))
  return -EPERM;

here. But I still do not see any problem, as ncpfs limits charset/codepage
length to 20 chars (+ NUL terminator), and nobody told me that it is
not possible to use " or - in codepage name ;-)
                                                    Best regards,
                                                        Petr Vandrovec
                                                        vandrove@vc.cvut.cz
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14  8:59   ` More modutils: It's probably worse Olaf Kirch
  2000-11-14 10:04     ` David Schleef
  2000-11-14 10:29     ` Guest section DW
@ 2000-11-14 19:20     ` Ben Ford
  2000-11-14 20:24       ` Michael H. Warfield
  2 siblings, 1 reply; 13+ messages in thread
From: Ben Ford @ 2000-11-14 19:20 UTC (permalink / raw)
  To: Olaf Kirch, linux-kernel@vger.kernel.org

Olaf Kirch wrote:

> sure request_module _does_not_ accept funky module names. Why allow
> people to shoot themselves (and, by extension, all other Linux users
> out there) in the foot?

I thought that was the whole purpose of Unix/Linux?

-b

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14 20:24       ` Michael H. Warfield
@ 2000-11-14 19:42         ` H. Peter Anvin
  2000-11-14 23:27           ` Keith Owens
  0 siblings, 1 reply; 13+ messages in thread
From: H. Peter Anvin @ 2000-11-14 19:42 UTC (permalink / raw)
  To: linux-kernel

Followup to:  <20001114152430.C2645@alcove.wittsend.com>
By author:    "Michael H. Warfield" <mhw@wittsend.com>
In newsgroup: linux.dev.kernel
>
> 	Oh, I hate to add to a remark like that (OK, I lied, I love
> trollbait...)
> 
> On Tue, Nov 14, 2000 at 11:20:35AM -0800, Ben Ford wrote:
> > Olaf Kirch wrote:
> 
> > > sure request_module _does_not_ accept funky module names. Why allow
> > > people to shoot themselves (and, by extension, all other Linux users
> > > out there) in the foot?
> 
> > I thought that was the whole purpose of Unix/Linux?
> 
> 	True!  Very true!  Unix/Linux requires that the user shoot
> themselves in the foot.  Windows automates that process and does it
> for the user, thus making foot shooting user friendly.  :-)
> 

Seriously, though, I don't see any reason modprobe shouldn't accept
funky filenames.  There is a standard way to do that, which is to have
an argument consisting of the string "--"; this indicates that any
further arguments should be considered filenames and not options.

For example:

rm -- -foo		# Delete a file named "-foo"

	-hpa

-- 
<hpa@transmeta.com> at work, <hpa@zytor.com> in private!
"Unix gives you enough rope to shoot yourself in the foot."
http://www.zytor.com/~hpa/puzzle.txt
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14 19:20     ` Ben Ford
@ 2000-11-14 20:24       ` Michael H. Warfield
  2000-11-14 19:42         ` H. Peter Anvin
  0 siblings, 1 reply; 13+ messages in thread
From: Michael H. Warfield @ 2000-11-14 20:24 UTC (permalink / raw)
  To: Ben Ford; +Cc: Olaf Kirch, linux-kernel@vger.kernel.org

	Oh, I hate to add to a remark like that (OK, I lied, I love
trollbait...)

On Tue, Nov 14, 2000 at 11:20:35AM -0800, Ben Ford wrote:
> Olaf Kirch wrote:

> > sure request_module _does_not_ accept funky module names. Why allow
> > people to shoot themselves (and, by extension, all other Linux users
> > out there) in the foot?

> I thought that was the whole purpose of Unix/Linux?

	True!  Very true!  Unix/Linux requires that the user shoot
themselves in the foot.  Windows automates that process and does it
for the user, thus making foot shooting user friendly.  :-)

> -b

	Mike
-- 
 Michael H. Warfield    |  (770) 985-6132   |  mhw@WittsEnd.com
  (The Mad Wizard)      |  (678) 463-0932   |  http://www.wittsend.com/mhw/
  NIC whois:  MHW9      |  An optimist believes we live in the best of all
 PGP Key: 0xDF1DD471    |  possible worlds.  A pessimist is sure of it!

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14 19:42         ` H. Peter Anvin
@ 2000-11-14 23:27           ` Keith Owens
  2000-11-15 10:43             ` Olaf Titz
  2000-11-17  0:48             ` Rusty Russell
  0 siblings, 2 replies; 13+ messages in thread
From: Keith Owens @ 2000-11-14 23:27 UTC (permalink / raw)
  To: linux-kernel

On 14 Nov 2000 11:42:42 -0800, 
"H. Peter Anvin" <hpa@zytor.com> wrote:
>Seriously, though, I don't see any reason modprobe shouldn't accept
>funky filenames.  There is a standard way to do that, which is to have
>an argument consisting of the string "--"; this indicates that any
>further arguments should be considered filenames and not options.

The original exploit had nothing to do with filenames masquerading as
options, it was: ping6 -I ';chmod o+w .'.  Then somebody pointed out
that -I '-C/my/config/file' could be abused as well.  '--' fixes the
second exploit but not the first.

The problem is the combination of kernel code passing user space
parameters through unchanged (promoting user input to root) plus the
modprobe meta expansion algorithm.  By treating the last parameter from
the kernel as a tainted module name (not an option) and suppressing
meta expansion on tainted parameters, modprobe removes enough of the
problem to be safe.

My changes to modprobe do nothing about this: "ping6 -I binfmt_misc".
That construct lets a user load any module.  However that is a pure
kernel problem which needs to be fixed by the developers who call
request_module.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14 23:27           ` Keith Owens
@ 2000-11-15 10:43             ` Olaf Titz
  2000-11-15 11:17               ` Tim Waugh
  2000-11-16  4:31               ` Keith Owens
  2000-11-17  0:48             ` Rusty Russell
  1 sibling, 2 replies; 13+ messages in thread
From: Olaf Titz @ 2000-11-15 10:43 UTC (permalink / raw)
  To: linux-kernel

> The original exploit had nothing to do with filenames masquerading as
> options, it was: ping6 -I ';chmod o+w .'.  Then somebody pointed out

Why is there any reason that a shell should be invoked anywhere in the
request_module->modprobe->insmod chain?
If implemented correctly, this attack should have the same result as
insmod ';chmod o+w .' (and it should not matter if it gets renamed so
that the actual command executed is insmod 'netdevice-;chmod o+w .')

> The problem is the combination of kernel code passing user space
> parameters through unchanged (promoting user input to root)

Which means that all parts of the chain which deal with possible user
input in elevated privilege mode must do input validation. This means
the kernel _and_ modprobe in my book.

> plus the
> modprobe meta expansion algorithm.

and I see no reason why modprobe should do any such thing, apart from
configurations dealt with in modules.conf anyway.

Olaf
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-15 10:43             ` Olaf Titz
@ 2000-11-15 11:17               ` Tim Waugh
  2000-11-16  4:31               ` Keith Owens
  1 sibling, 0 replies; 13+ messages in thread
From: Tim Waugh @ 2000-11-15 11:17 UTC (permalink / raw)
  To: Olaf Titz; +Cc: linux-kernel

[-- Attachment #1: Type: text/plain, Size: 342 bytes --]

On Wed, Nov 15, 2000 at 11:43:54AM +0100, Olaf Titz wrote:

> > plus the
> > modprobe meta expansion algorithm.
> 
> and I see no reason why modprobe should do any such thing, apart from
> configurations dealt with in modules.conf anyway.

If it helps, wordexp has a flag to prevent command substitutions from
occuring.

Tim.
*/

[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-15 10:43             ` Olaf Titz
  2000-11-15 11:17               ` Tim Waugh
@ 2000-11-16  4:31               ` Keith Owens
  1 sibling, 0 replies; 13+ messages in thread
From: Keith Owens @ 2000-11-16  4:31 UTC (permalink / raw)
  To: Olaf Titz; +Cc: linux-kernel

On Wed, 15 Nov 2000 11:43:54 +0100, 
>Why is there any reason that a shell should be invoked anywhere in the
>request_module->modprobe->insmod chain?
>If implemented correctly, this attack should have the same result as
>insmod ';chmod o+w .' (and it should not matter if it gets renamed so
>that the actual command executed is insmod 'netdevice-;chmod o+w .')

You are confusing two different problems.  The meta expansion problem
means ;chmod o+w .' does nasty things to your system.  The other
problem is that any user can load any module by ping6 -I module_name.

>> plus the
>> modprobe meta expansion algorithm.
>
>and I see no reason why modprobe should do any such thing, apart from
>configurations dealt with in modules.conf anyway.

modutils 2.3.20 only does meta expansion for entries in the config
file, not for input from the command line.  That fixes the first
problem but does nothing about the second.  The only way to fix the
second problem is by always adding a prefix to the user input before
passing it to modprobe, that fix has to be in the kernel, not modutils.

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

* Re: More modutils: It's probably worse.
  2000-11-14 23:27           ` Keith Owens
  2000-11-15 10:43             ` Olaf Titz
@ 2000-11-17  0:48             ` Rusty Russell
  1 sibling, 0 replies; 13+ messages in thread
From: Rusty Russell @ 2000-11-17  0:48 UTC (permalink / raw)
  To: Keith Owens; +Cc: linux-kernel, torvalds

In message <11900.974244463@ocs3.ocs-net> you write:
> On 14 Nov 2000 11:42:42 -0800, 
> "H. Peter Anvin" <hpa@zytor.com> wrote:
> >Seriously, though, I don't see any reason modprobe shouldn't accept
> >funky filenames.  There is a standard way to do that, which is to have
> >an argument consisting of the string "--"; this indicates that any
> >further arguments should be considered filenames and not options.
> 
> The original exploit had nothing to do with filenames masquerading as
> options, it was: ping6 -I ';chmod o+w .'.  Then somebody pointed out
> that -I '-C/my/config/file' could be abused as well.  '--' fixes the
> second exploit but not the first.

Yes, modprobe code is stupid (execing insmod without "--").  Of
course, the passing of flags to modprobe is pretty broken too (the
kernel shouldn't assume anything about modprobe, otherwise why bother
with the /proc entry?)

But the kernel should be fixed for future:

--- working-2.4.0-test11-5/kernel/kmod.c.~1~	Wed Oct  4 15:17:12 2000
+++ working-2.4.0-test11-5/kernel/kmod.c	Fri Nov 17 11:44:09 2000
@@ -133,7 +133,7 @@
 static int exec_modprobe(void * module_name)
 {
 	static char * envp[] = { "HOME=/", "TERM=linux", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
-	char *argv[] = { modprobe_path, "-s", "-k", (char*)module_name, NULL };
+	char *argv[] = { modprobe_path, "-s", "-k", "--", (char*)module_name, NULL };
 	int ret;
 
 	ret = exec_usermodehelper(modprobe_path, argv, envp);
--
Hacking time.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2000-11-17  1:19 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <Pine.LNX.4.21.0011132040160.1699-100000@ferret.lmh.ox.ac.uk>
     [not found] ` <Pine.LNX.4.21.0011132352550.31869-100000@dione.ids.pl>
2000-11-14  8:59   ` More modutils: It's probably worse Olaf Kirch
2000-11-14 10:04     ` David Schleef
2000-11-14 10:29     ` Guest section DW
2000-11-14 10:38       ` Olaf Kirch
2000-11-14 19:20     ` Ben Ford
2000-11-14 20:24       ` Michael H. Warfield
2000-11-14 19:42         ` H. Peter Anvin
2000-11-14 23:27           ` Keith Owens
2000-11-15 10:43             ` Olaf Titz
2000-11-15 11:17               ` Tim Waugh
2000-11-16  4:31               ` Keith Owens
2000-11-17  0:48             ` Rusty Russell
2000-11-14 12:47 Petr Vandrovec

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox