All of lore.kernel.org
 help / color / mirror / Atom feed
From: Joe Perches <joe@perches.com>
To: "Roberts, William C" <william.c.roberts@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"apw@canonical.com" <apw@canonical.com>
Cc: "kernel-hardening@lists.openwall.com" 
	<kernel-hardening@lists.openwall.com>
Subject: Re: [PATCH] checkpatch: add warning on %pk instead of %pK usage
Date: Mon, 13 Feb 2017 12:14:55 -0800	[thread overview]
Message-ID: <1487016895.6214.8.camel@perches.com> (raw)
In-Reply-To: <476DC76E7D1DF2438D32BFADF679FC562305F372@ORSMSX103.amr.corp.intel.com>

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

(resending including cc's)

On Mon, 2017-02-13 at 19:46 +0000, Roberts, William C wrote:
> > -----Original Message-----
> > From: Joe Perches [mailto:joe@perches.com]
> > Sent: Friday, February 10, 2017 7:24 PM
> > To: Roberts, William C <william.c.roberts@intel.com>; linux-
> > kernel@vger.kernel.org; apw@canonical.com
> > Cc: kernel-hardening@lists.openwall.com
> > Subject: Re: [PATCH] checkpatch: add warning on %pk instead of %pK usage
> > 
> > On Sat, 2017-02-11 at 01:32 +0000, Roberts, William C wrote:
> > > <snip>
> > > > > By "normal" I'm referring to things that call into pointer(), just
> > > > > casually looking I see bstr_printf vsnprintf kvasprintf, which
> > > > > would be easy enough to add
> > > > > 
> > > > > > What do you think is missing?  sn?printf ? That's easy to add.
> > > > > 
> > > > > The problem starts to get hairy when we think of how often folks
> > > > > roll their own logging macros (see some small sampling at the end).
> > > > > 
> > > > > I think we would want to add DEBUG DBG and sn?printf and maybe
> > > > > consider dropping the \b on the regex so it's a bit more matchy
> > > > > but still shouldn't end up matching on any ASM as you pointed out in the V2
> > 
> > nack.
> > > > > 
> > > > > Ill break this down into:
> > > > > 1. the patch as I know you'll take it, as you wrote it :-P 2.
> > > > > Adding to the logging macros 3. exploring making it less matchy
> > > 
> > > -Kees and Andrew they likely don't care about the rest of this...
> > > 
> > > I have been working up a regex (I suck at these) to match C functions
> > > that have an invalid %p format string and take arguments:
> > > http://www.regexr.com/3f92k
> > > 
> > > This could be a way to get better coverage in a more generic approach,
> > 
> > thoughts?
> > 
> > Maybe this: (attached too because Evolution is a bad email client)
> > 
> > It's still kind of hacky, but it does find multiple line statements like:
> > 
> > +		printf(KERN_INFO
> > +		       "a %pX",
> > +		       foo);
> > 
> 
> I downloaded your checkpatch.pl patch wouldn't apply for some reason... I applied it by hand and
> couldn't get it to trigger on either the case you show above or below:
> 
> +	MY_DEBUG(drv->foo,
> +		"%pk",
> +		foo->boo);
> +
> 
> > ---
> > Subject: [PATCH] checkpatch: Add ability to find bad uses of vsprintf %p
> > extensions
> > 
> > %pK was at least once misused at %pk in an out-of-tree module.
> > This lead to some security concerns.  Add the ability to track single and multiple
> > line statements for misuses of %p.
> > 
> > Signed-off-by: Joe Perches
> > ---
> >  scripts/checkpatch.pl | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> > 
> > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index
> > ad5ea5c545b2..0eaf6b8580d6 100755
> > --- a/scripts/checkpatch.pl
> > +++ b/scripts/checkpatch.pl
> > @@ -5676,6 +5676,32 @@ sub process {
> >  			}
> >  		}
> > 
> > +		# check for vsprintf extension %p misuses
> > +		if ($^V && $^V ge 5.10.0 &&
> > +		    defined $stat &&
> > +		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
> > +		    $1 !~ /^_*volatile_*$/) {
> > +			my $bad_extension = "";
> > +			my $lc = $stat =~ tr@\n@@;
> > +			$lc = $lc + $linenr;
> > +		        for (my $count = $linenr; $count <= $lc; $count++) {
> > +				my $fmt = get_quoted_string($lines[$count - 1],
> > raw_line($count, 0));
> > +				$fmt =~ s/%%//g;
> > +				if ($fmt =~
> > /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGN]).)/) {
> > +					$bad_extension = $1;
> > +					last;
> > +				}
> > +			}
> > +			if ($bad_extension ne "") {
> > +				my $stat_real = raw_line($linenr, 0);
> > +				for (my $count = $linenr + 1; $count <= $lc;
> > $count++) {
> > +					$stat_real = $stat_real . "\n" .
> > raw_line($count, 0);
> > +				}
> > +				WARN("VSPRINTF_POINTER_EXTENSION",
> > +				     "Invalid vsprintf pointer extension
> > '$bad_extension'\n" . "$here\n$stat_real\n");
> > +			}
> > +		}
> > +
> >  # Check for misused memsets
> >  		if ($^V && $^V ge 5.10.0 &&
> >  		    defined $stat &&
> > --
> 
> Mixed tabs/spaces issues. But I like the concept of matching across multiple lines. My tree was set to:
> 
> commit 7089db84e356562f8ba737c29e472cc42d530dbc
> Author: Linus Torvalds <torvalds@linux-foundation.org>
> Date:   Sun Feb 12 13:03:20 2017 -0800
> 
>     Linux 4.10-rc8
> 
> $ git apply --check ~/Downloads/0001-checkpatch-Add-ability-to-find-bad-uses-of-vsprintf-.patch
> error: patch failed: scripts/checkpatch.pl:5676
> error: scripts/checkpatch.pl: patch does not apply
> 

No worries.
No idea why it doesn't work for you.
Maybe the hand applying was somehow
faulty?

The attached is on top of -next so it does have offsets
on Linus' tree, but it seems to work.

(on -linux)

$ patch -p1 < cp_vsp.diff 
patching file scripts/checkpatch.pl
Hunk #1 succeeded at 5634 (offset -36 lines).

$ cat t_block.c
{
	MY_DEBUG(drv->foo,
		 "%pk",
		 foo->boo);
}
$ ./scripts/checkpatch.pl -f t_block.c
WARNING: Invalid vsprintf pointer extension '%pk'
#2: FILE: t_block.c:2:
+	MY_DEBUG(drv->foo,
+		 "%pk",
+		 foo->boo);

total: 0 errors, 1 warnings, 5 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

t_block.c has style problems, please review.

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[-- Attachment #2: cp_vsp.diff --]
[-- Type: text/x-patch, Size: 1301 bytes --]

 scripts/checkpatch.pl | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 8e96af53611c..4cb90d5f04ce 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5670,6 +5670,32 @@ sub process {
 			}
 		}
 
+		# check for vsprintf extension %p<foo> misuses
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
+		    $1 !~ /^_*volatile_*$/) {
+			my $bad_extension = "";
+			my $lc = $stat =~ tr@\n@@;
+			$lc = $lc + $linenr;
+		        for (my $count = $linenr; $count <= $lc; $count++) {
+				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
+				$fmt =~ s/%%//g;
+				if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGN]).)/) {
+					$bad_extension = $1;
+					last;
+				}
+			}
+			if ($bad_extension ne "") {
+				my $stat_real = raw_line($linenr, 0);
+				for (my $count = $linenr + 1; $count <= $lc; $count++) {
+					$stat_real = $stat_real . "\n" . raw_line($count, 0);
+				}
+				WARN("VSPRINTF_POINTER_EXTENSION",
+				     "Invalid vsprintf pointer extension '$bad_extension'\n" . "$here\n$stat_real\n");
+			}
+		}
+
 # Check for misused memsets
 		if ($^V && $^V ge 5.10.0 &&
 		    defined $stat &&

WARNING: multiple messages have this Message-ID (diff)
From: Joe Perches <joe@perches.com>
To: "Roberts, William C" <william.c.roberts@intel.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"apw@canonical.com" <apw@canonical.com>
Cc: "kernel-hardening@lists.openwall.com"
	<kernel-hardening@lists.openwall.com>
Subject: [kernel-hardening] Re: [PATCH] checkpatch: add warning on %pk instead of %pK usage
Date: Mon, 13 Feb 2017 12:14:55 -0800	[thread overview]
Message-ID: <1487016895.6214.8.camel@perches.com> (raw)
In-Reply-To: <476DC76E7D1DF2438D32BFADF679FC562305F372@ORSMSX103.amr.corp.intel.com>

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

(resending including cc's)

On Mon, 2017-02-13 at 19:46 +0000, Roberts, William C wrote:
> > -----Original Message-----
> > From: Joe Perches [mailto:joe@perches.com]
> > Sent: Friday, February 10, 2017 7:24 PM
> > To: Roberts, William C <william.c.roberts@intel.com>; linux-
> > kernel@vger.kernel.org; apw@canonical.com
> > Cc: kernel-hardening@lists.openwall.com
> > Subject: Re: [PATCH] checkpatch: add warning on %pk instead of %pK usage
> > 
> > On Sat, 2017-02-11 at 01:32 +0000, Roberts, William C wrote:
> > > <snip>
> > > > > By "normal" I'm referring to things that call into pointer(), just
> > > > > casually looking I see bstr_printf vsnprintf kvasprintf, which
> > > > > would be easy enough to add
> > > > > 
> > > > > > What do you think is missing?  sn?printf ? That's easy to add.
> > > > > 
> > > > > The problem starts to get hairy when we think of how often folks
> > > > > roll their own logging macros (see some small sampling at the end).
> > > > > 
> > > > > I think we would want to add DEBUG DBG and sn?printf and maybe
> > > > > consider dropping the \b on the regex so it's a bit more matchy
> > > > > but still shouldn't end up matching on any ASM as you pointed out in the V2
> > 
> > nack.
> > > > > 
> > > > > Ill break this down into:
> > > > > 1. the patch as I know you'll take it, as you wrote it :-P 2.
> > > > > Adding to the logging macros 3. exploring making it less matchy
> > > 
> > > -Kees and Andrew they likely don't care about the rest of this...
> > > 
> > > I have been working up a regex (I suck at these) to match C functions
> > > that have an invalid %p format string and take arguments:
> > > http://www.regexr.com/3f92k
> > > 
> > > This could be a way to get better coverage in a more generic approach,
> > 
> > thoughts?
> > 
> > Maybe this: (attached too because Evolution is a bad email client)
> > 
> > It's still kind of hacky, but it does find multiple line statements like:
> > 
> > +		printf(KERN_INFO
> > +		       "a %pX",
> > +		       foo);
> > 
> 
> I downloaded your checkpatch.pl patch wouldn't apply for some reason... I applied it by hand and
> couldn't get it to trigger on either the case you show above or below:
> 
> +	MY_DEBUG(drv->foo,
> +		"%pk",
> +		foo->boo);
> +
> 
> > ---
> > Subject: [PATCH] checkpatch: Add ability to find bad uses of vsprintf %p
> > extensions
> > 
> > %pK was at least once misused at %pk in an out-of-tree module.
> > This lead to some security concerns.  Add the ability to track single and multiple
> > line statements for misuses of %p.
> > 
> > Signed-off-by: Joe Perches
> > ---
> >  scripts/checkpatch.pl | 26 ++++++++++++++++++++++++++
> >  1 file changed, 26 insertions(+)
> > 
> > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index
> > ad5ea5c545b2..0eaf6b8580d6 100755
> > --- a/scripts/checkpatch.pl
> > +++ b/scripts/checkpatch.pl
> > @@ -5676,6 +5676,32 @@ sub process {
> >  			}
> >  		}
> > 
> > +		# check for vsprintf extension %p misuses
> > +		if ($^V && $^V ge 5.10.0 &&
> > +		    defined $stat &&
> > +		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
> > +		    $1 !~ /^_*volatile_*$/) {
> > +			my $bad_extension = "";
> > +			my $lc = $stat =~ tr@\n@@;
> > +			$lc = $lc + $linenr;
> > +		        for (my $count = $linenr; $count <= $lc; $count++) {
> > +				my $fmt = get_quoted_string($lines[$count - 1],
> > raw_line($count, 0));
> > +				$fmt =~ s/%%//g;
> > +				if ($fmt =~
> > /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGN]).)/) {
> > +					$bad_extension = $1;
> > +					last;
> > +				}
> > +			}
> > +			if ($bad_extension ne "") {
> > +				my $stat_real = raw_line($linenr, 0);
> > +				for (my $count = $linenr + 1; $count <= $lc;
> > $count++) {
> > +					$stat_real = $stat_real . "\n" .
> > raw_line($count, 0);
> > +				}
> > +				WARN("VSPRINTF_POINTER_EXTENSION",
> > +				     "Invalid vsprintf pointer extension
> > '$bad_extension'\n" . "$here\n$stat_real\n");
> > +			}
> > +		}
> > +
> >  # Check for misused memsets
> >  		if ($^V && $^V ge 5.10.0 &&
> >  		    defined $stat &&
> > --
> 
> Mixed tabs/spaces issues. But I like the concept of matching across multiple lines. My tree was set to:
> 
> commit 7089db84e356562f8ba737c29e472cc42d530dbc
> Author: Linus Torvalds <torvalds@linux-foundation.org>
> Date:   Sun Feb 12 13:03:20 2017 -0800
> 
>     Linux 4.10-rc8
> 
> $ git apply --check ~/Downloads/0001-checkpatch-Add-ability-to-find-bad-uses-of-vsprintf-.patch
> error: patch failed: scripts/checkpatch.pl:5676
> error: scripts/checkpatch.pl: patch does not apply
> 

No worries.
No idea why it doesn't work for you.
Maybe the hand applying was somehow
faulty?

The attached is on top of -next so it does have offsets
on Linus' tree, but it seems to work.

(on -linux)

$ patch -p1 < cp_vsp.diff 
patching file scripts/checkpatch.pl
Hunk #1 succeeded at 5634 (offset -36 lines).

$ cat t_block.c
{
	MY_DEBUG(drv->foo,
		 "%pk",
		 foo->boo);
}
$ ./scripts/checkpatch.pl -f t_block.c
WARNING: Invalid vsprintf pointer extension '%pk'
#2: FILE: t_block.c:2:
+	MY_DEBUG(drv->foo,
+		 "%pk",
+		 foo->boo);

total: 0 errors, 1 warnings, 5 lines checked

NOTE: For some of the reported defects, checkpatch may be able to
      mechanically convert to the typical style using --fix or --fix-inplace.

t_block.c has style problems, please review.

NOTE: If any of the errors are false positives, please report
      them to the maintainer, see CHECKPATCH in MAINTAINERS.

[-- Attachment #2: cp_vsp.diff --]
[-- Type: text/x-patch, Size: 1301 bytes --]

 scripts/checkpatch.pl | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 8e96af53611c..4cb90d5f04ce 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -5670,6 +5670,32 @@ sub process {
 			}
 		}
 
+		# check for vsprintf extension %p<foo> misuses
+		if ($^V && $^V ge 5.10.0 &&
+		    defined $stat &&
+		    $stat =~ /^\+(?![^\{]*\{\s*).*\b(\w+)\s*\(.*$String\s*,/s &&
+		    $1 !~ /^_*volatile_*$/) {
+			my $bad_extension = "";
+			my $lc = $stat =~ tr@\n@@;
+			$lc = $lc + $linenr;
+		        for (my $count = $linenr; $count <= $lc; $count++) {
+				my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
+				$fmt =~ s/%%//g;
+				if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGN]).)/) {
+					$bad_extension = $1;
+					last;
+				}
+			}
+			if ($bad_extension ne "") {
+				my $stat_real = raw_line($linenr, 0);
+				for (my $count = $linenr + 1; $count <= $lc; $count++) {
+					$stat_real = $stat_real . "\n" . raw_line($count, 0);
+				}
+				WARN("VSPRINTF_POINTER_EXTENSION",
+				     "Invalid vsprintf pointer extension '$bad_extension'\n" . "$here\n$stat_real\n");
+			}
+		}
+
 # Check for misused memsets
 		if ($^V && $^V ge 5.10.0 &&
 		    defined $stat &&

  reply	other threads:[~2017-02-13 20:15 UTC|newest]

Thread overview: 50+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-10 19:37 [PATCH] checkpatch: add warning on %pk instead of %pK usage william.c.roberts
2017-02-10 19:37 ` [kernel-hardening] " william.c.roberts
2017-02-10 20:12 ` Joe Perches
2017-02-10 20:12   ` [kernel-hardening] " Joe Perches
2017-02-10 22:14   ` Roberts, William C
2017-02-10 22:14     ` [kernel-hardening] " Roberts, William C
2017-02-10 22:26     ` Roberts, William C
2017-02-10 22:26       ` [kernel-hardening] " Roberts, William C
2017-02-10 22:49       ` Joe Perches
2017-02-10 22:49         ` [kernel-hardening] " Joe Perches
2017-02-10 22:59         ` Joe Perches
2017-02-10 22:59           ` [kernel-hardening] " Joe Perches
2017-02-10 23:31         ` Roberts, William C
2017-02-10 23:31           ` [kernel-hardening] " Roberts, William C
2017-02-10 23:49           ` Joe Perches
2017-02-10 23:49             ` [kernel-hardening] " Joe Perches
2017-02-10 23:54         ` Roberts, William C
2017-02-10 23:54           ` [kernel-hardening] " Roberts, William C
2017-02-11  0:01           ` Joe Perches
2017-02-11  0:01             ` [kernel-hardening] " Joe Perches
2017-02-11  1:32         ` Roberts, William C
2017-02-11  1:32           ` [kernel-hardening] " Roberts, William C
2017-02-11  3:23           ` Joe Perches
2017-02-11  3:23             ` [kernel-hardening] " Joe Perches
2017-02-13 19:46             ` Roberts, William C
2017-02-13 19:46               ` [kernel-hardening] " Roberts, William C
2017-02-13 20:14               ` Joe Perches [this message]
2017-02-13 20:14                 ` [kernel-hardening] " Joe Perches
     [not found]               ` <1487016251.6214.6.camel@perches.com>
     [not found]                 ` <476DC76E7D1DF2438D32BFADF679FC562305F62F@ORSMSX103.amr.corp.intel.com>
2017-02-13 22:20                   ` Joe Perches
2017-02-13 22:20                     ` [kernel-hardening] " Joe Perches
2017-02-15 23:49                     ` Roberts, William C
2017-02-15 23:49                       ` [kernel-hardening] " Roberts, William C
2017-02-16  0:19                       ` Joe Perches
2017-02-16  0:19                         ` [kernel-hardening] " Joe Perches
2017-02-27 16:26                       ` Roberts, William C
2017-02-27 16:26                         ` [kernel-hardening] " Roberts, William C
2017-02-27 20:54                         ` [PATCH] checkpatch: Add ability to find bad uses of vsprintf %p<foo> extensions Joe Perches
2017-02-27 20:54                           ` [kernel-hardening] " Joe Perches
2017-02-27 21:18                           ` Kees Cook
2017-02-27 21:18                             ` Kees Cook
2017-02-28 15:34                           ` Roberts, William C
2017-02-28 15:34                             ` [kernel-hardening] " Roberts, William C
2017-03-01  0:06                           ` Andrew Morton
2017-03-01  0:06                             ` [kernel-hardening] " Andrew Morton
2017-03-01  0:11                             ` Kees Cook
2017-03-01  0:11                               ` Kees Cook
2017-03-01  1:14                               ` Joe Perches
2017-03-01  1:14                                 ` Joe Perches
2017-03-01  0:12                             ` Joe Perches
2017-03-01  0:12                               ` [kernel-hardening] " Joe Perches

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1487016895.6214.8.camel@perches.com \
    --to=joe@perches.com \
    --cc=apw@canonical.com \
    --cc=kernel-hardening@lists.openwall.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=william.c.roberts@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.