Re: Detecting user data on base types

Andrew Murray <[email protected]>
Newsgroups org.kernel.vger.smatch
Message-ID <[email protected]>
On Thu, Jun 06, 2019 at 05:39:31PM +0300, Dan Carpenter wrote:
> On Wed, Jun 05, 2019 at 09:29:26AM +0100, Andrew Murray wrote:
> > Through this discussion I'm able to detect when annotated function parameters contain
> > user provided values. The challenge for me is to detect where that data originated
> > from (i.e. following the parameter up the call tree) to ease debugging.
> > 
> > My first attempt didn't trace the parameters and just looked at the call tree for any
> > functions which provided user data, however this resulted in false positives (e.g.
> > just because a function higher up in the call stack passed user data, it doesn't mean
> > it was this data that made it to the target function).
> 
> One of the main causes of this is function pointers that take a void
> pointer argument.  For example, iblock_execute_sync_cache() takes a
> user controlled "cmd" struct and says "bio->bi_private = cmd;"
> Then in floppy_rb0_cb() we do:
> 
> 	struct rb0_cbdata *cbdata = (struct rb0_cbdata *)bio->bi_private;
> 
> And smatch says that *cbdata is entirely user controlled...  The nice
> fix for this would be if the mtag code were implimented and we could
> tie function pointers to their data pointers very accurately.
> Unfortunately, that's a pretty huge project and it's going to take a
> while to complete.
> 
> A quicker fix is to add a line to smatch_data/db/fixup_kernel.sh
> 
> delete from caller_info where function = '(struct bio)->bi_end_io' and type = 8017;
> 
> which just deletes the user data from caller_info.

Ah yes I understand this. Though really what I was referring to is:

funca(int __untagged x, int dontcare){
}

funcb(int __user y){
	funca(y, 0);
}

funcc(int z, int __user g){
	funca(z, g);
}

funcd(){
	funca(22, 0);
}

Without relying on parameter tracing, a calltree that has been filtered of
calls without USER_DATA will look this:

funca
 - funcb
 - funcc

We don't want the false positive of funcc being in this tree - it's here
because funcc calls funca with user data - its a parameter we don't care about.

However so long as we trace parameters (even if they are modified) through
the call tree, then it's possible to update the scripts to show a call stack
that is filtered for userdata for only parameters of interest.

Thanks,

Andrew Murray 

> 
> regards,
> dan carpenter
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.