Thread (13 messages) 13 messages, 3 authors, 2009-10-13

Re: [resend][PATCH] Added PR_SET_PROCTITLE_AREA option for prctl()

flat view

From: KOSAKI Motohiro <hidden>
Date: 2009-10-12 19:05:30
Also in: lkml

Hi

Sorry for the delaying.
On Sat, Oct 10, 2009 at 2:32 AM, KOSAKI Motohiro
[off-list ref] wrote:
quoted
quoted
It does seem like a maximum spin count should be put in there - and
maybe a timeout as well (since with FUSE etc it's possible to engineer
page faults that take arbitrarily long).
Also, it occurs to me that:
makes sense.
I like maximum spin rather than timeout.
I'm worried about the scenario where process A sets its cmdline buffer
to point to a page which will take a _VERY_ long time to pagein (maybe
forever), and then process B goes to try to read its cmdline. What
happens now?
Honestly, I don't worry about so much. if attacker want DoS attack, fork bomb is
efficient than this way. then, attacker never use this.

Process A can arrange for this to happen by using a FUSE filesystem
that sits on a read forever. And since the first thing the admin's
likely to do to track down the problem is 'ps awux', this is liable to
be a rather nasty DoS...
Probably, I haven't understand this paragraph. Why is this FUSE related issue?
Of course, this is no worse than it is now - it's already possible to
replace the page in question. But we should think about ways this
could be fixed for good...
Plus, please look my mesurement data as another post. seqlock implementation is very fast
although contention occured.


quoted
quoted
quoted
+     do {
+             seq = read_seqbegin(&mm->arg_lock);
+
+             len = mm->arg_end - mm->arg_start;
+             if (len > PAGE_SIZE)
+                     len = PAGE_SIZE;
If arg_end or arg_start are modified after this, is it truly safe to
assume that len will remain <= PAGE_SIZE without a memory barrier
before the conditional?
1) access_process_vm() doesn't return error value.
2) read_seqretry(&mm->arg_lock, seq)) check seq, not mm->arg_start or len.

then, if arg_{start,end} is modified, access_process_vm() may return 0
and strnlen
makes bad calculation, but read_seqretry() can detect its modify
rightly. I think.
No, I'm worried about what if the compiler decides to rewrite like so:
if (mm->arg_end - mm->arg_start > PAGE_SIZE)
  len = PAGE_SIZE;
else /* here we reload arg_end/arg_start! */
  len = mm->arg_end - mm->arg_start;

Now we might write into buffer more than PAGE_SIZE bytes, which is
probably a buffer overrun into kernel space...
Rgiht. I'll fix this issue at next spin.
Thank you.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help