Closed Bug 40538 Opened 24 years ago Closed 23 years ago

security.checkloadURI logs file URL errors to JavaScript Console

Categories

(Core :: Security, defect, P3)

x86
Linux
defect

Tracking

()

VERIFIED FIXED
mozilla0.9

People

(Reporter: blizzard, Assigned: security-bugs)

References

Details

(Keywords: relnote, verifyme, Whiteboard: send post-fix dupes to bug 84128)

If you have a file:/// url in a web page it doesn't get downloaded however it
works fine if the original page was on the local filesystem.  Given the file:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
  <body>
<a href="file:///tmp/">file:///tmp/</a>
  </body>
</html>

It works fine on the local filesystem but put it up on a web server and it never
downloads the content.
Adding people that might know more than I.
This is the correct behavior. A page loaded from the web should not be allowed to 
load pages from the local filesystem. Among other things, this allows an attacker 
to see if a specific local file exists. IE allows this behavior, and it has led 
to several vulnerabilities recently. (Notably, using IE to read someone's 
Netscape prefs.js file). Do you have code that depends on this behavior? I'm 
reassigning this to me, and if I don't hear any objections, I'm going to mark 
this INVALID.
Assignee: gagan → mstoltz
See this url in NS4.

http://feed.0xdeadbeef.com/~blizzard/test.html

How is this a vulnerability?  Are you worried about someone doing something
across frames or something?
See bug 16858 and recent IE exploit involving reading prefs.js file. Opening 
arbitrary file: URL's facilitates the sorts of problems IE is prone to 
lately...if someone can cause a file to be downloaded to your machine (in a cache 
file, or by having the user consent to download it to a known directory), and the 
downloaded file contains JS, then referencing it via a file: URL on a hostile web 
page would cause the JS to be run, and since it's coming from the local drive, it 
would run with privileges. I can see this leading to 'love bug' type scenarios. 
At the very least, it gives an attacker information about your local machine 
which should not be available.
I save html files to my hard disk often, so I don't see this as a complete fix 
for the security issue.
Ok, I can see how you have security concerns.  It doesn't change the fact that
as someone who is using mozilla in an embedding context I need to be able to
handle file:// urls with another viewer than Mozilla.  So, how do I find out
when someone requests one?  It never seems to make it to the nsIWebBrowser code.
Chris, I'm not clear on what you need. Can you give me an example? 
Status: NEW → ASSIGNED
Mitch,

Are you saying that the file:// protocol in SeaMonkey will be different that 4.x
?

In 4.x, if i type this into the location bar:

file:///tmp/

The browser goes there.

In SeaMonkey it dont if the content came from a http:// stream.

It does if the content itself came from a localfile.

It seems to me this should work the same as it did in 4.x.

Now, the issue of evil JavaScript code inside of that content being executed is
something else.  Of course that the security model in SeaMonkey should prevent
such code from executing.  

Or did i tottaly miss something ?

To be more specific, I need this feature to control my embedded application.  Im
working on a file manager which (of course!) can deal with file:// uri just
fine.

When i try to get embedded mozilla to deal with  <a href="file:///foo/">
content, it doesnt.  I need this url to be dispatched as any other would, so
that im my embedding app i can track the opening of the url and deal with it
myself.   But because of this bug, im not even given the chance!

Perhaps there is a way for me to query some interface to turn this security
check off ?  I could do this in my embedded app safely knowing that I am always
going to handle file:/// uri's myself.

Thanks for looking at this and please let me know if there is anything i can do
te help get this fixed or workaround it.
Adding a hidden preference for turning this security check off. Nominating 
nsbeta2.
Blocks: 37425
Keywords: nsbeta2
Whiteboard: Fix in hand
Target Milestone: --- → M17
Putting on [nsbeta2-] radar. Will not hold beta 2 for this.  ramiro could land 
pref via mozilla...see brendan/waterson.

If you can give us a top100 site, PDT would make [nsbeta2+]
Whiteboard: Fix in hand → [nsbeta2-] Fix in hand
Pref is checked in. I'm leaving this bug open as a placeholder for URL loading
security issues which still need to be worked out. THis code is not in its final
form yet, and the behavior of this pref needs to be tested after the code is
finished.
Whiteboard: [nsbeta2-] Fix in hand → [nsbeta2-]
*** Bug 47988 has been marked as a duplicate of this bug. ***
I posted these comments to bug 47988, reposting here for comments:

Thanks for your input as to the inconsistencies. However, inconsistencies are not 
a justification for removing this security feature. I realize this security check 
(nsScriptSecurityManager::CheckLoadURI) is not called everywhere it should be 
(it's not currently called for IMG tags, for example) and it looks like right-
clicking a link takes a different code path which doesn't have the check. I'm 
going to make this consistent by adding the check everywhere it's needed. 

The reason this is a security issue is that it facilitates exploits. Although web 
scripts are denied access to the content of pages coming from other sites, even 
being able to load those pages in a window can allow some malicious behavior. For 
example, accessing a user's prefs.js file (easy to find if the user is using the 
default profile) inside a SCRIPT tag causes the prefs file to be executed as 
Javascript, which allows stealing your email settings, among other things. That's 
just one example. With some types of tags (such as STYLE), pointing at a local 
URL allows an attqacker to determine whether a local file exists at a particular 
location. In general, it's a bad idea. This "feature" of being able to point at 
local files has led to a bunch of exploits in IE. Brad, the 'very bad behavior' 
is on the part of sites which attempt to make use of your local drive. 

  I realize that this is a tradeoff between security and functionality. Any 
concrete data (rather than opinions) which you can give me on the necessity of 
allowing local files to be loaded by remote content would be very helpful. Are 
there popular, large-scale, 'top-100' sites which depend on this behavior? Are 
there corporate users who need it, and for whom setting "security.checkloaduri" 
to bypass this restriction is not an option? Am I overstating the security 
vulnerability here? 
The 'very bad behavior' quote is out of context.  I was referring to the fact
that Mozilla presents a link to the user, and when the user clicks on it,
absolutely nothing happens.  Mozilla should give some indication that the
hyperlink was blocked due to security concerns.  Perhaps this should be a filed
as separate bug?

Is there any way to differentiate between loading a local file as a "top-level"
document, and loading it as part of another document?  Thus, the only time one
could access a local file from a remote site would be directly through a
hyperlink, while loading a file as a smaller part of a page would be denied.

I don't have a 'top-100' site, but I do have a web server script that runs on
our internal network that provides 'file:' links to various nfs-mounted
directories.  I'd hate to disable this protection on everyone's browser (opening
them to attacks from outside sites) just to allow them to view these url's.

That application is available here:

http://public.perforce.com/cgi-bin/p4db/dtb.cgi?FSPC=guest/brad_garcia&HIDEDEL=NO
Depends on: 24739
Target Milestone: M17 → M18
You wouldn't be "opening them to attacks from outside sites." Allowing local
file links doesn't directly open up any exploits that I'm aware of, it just
makes the environment a bit less secure. Netscape browsers through the current
4.7, and most versions of IE, allow local file links, so you're not exposing
yourself terribly by setting "security.checkloaduri" to false. People have asked
me to allow this on a site-by-site basis, like our per-domain DOM security
policy mechanism, but I haven't seen a huge demand for this. I'm marking this
bug FUTURE so we can revisit this issue after NS6.0 ships. 
Target Milestone: M18 → Future
Thanks for the explanation.

There is still the issue of a user clicking on a link and nothing happening.
This makes for a bad interface and confuses the user.  I can see users
complaining to web site operators (or the IT staff, for intranet servers like
ours) that the links on a page are bad.  Expecting every user to have
"security.checkloaduri" set to false is not the solution to this problem.  When
set to true, mozilla should tell the user that it is choosing not to follow the
link.

If you'd like to keep this bug around with a Target of "Future" to track this
bug from a security standpoint, then I think it would be good to open a new bug
about the user interface issue with a more immediate Target.  Does this sound
reasonable to you?
Brad,
   Sounds reasonable, except that I'm probably not going to have the time to do 
it. I think the appropriate way to inform the user, the way we use in similar 
situatons involving "bad" Javascript or HTML content, is to post a message to the 
console. This is easy. would you like to do it, or do you know someone who would? 
Take a look at 
http://lxr.mozilla.org/seamonkey/source/modules/libjar/nsJAR.cpp#768 for an 
example.
Keywords: nsbeta2
Whiteboard: [nsbeta2-]
*** Bug 54286 has been marked as a duplicate of this bug. ***
*** Bug 67200 has been marked as a duplicate of this bug. ***
*** Bug 69975 has been marked as a duplicate of this bug. ***
It might be good to include, as part of the error message, a hint about how to 
relax the restriction for a specific website.
Sure, if that were possible. But it isn't yet.
*** Bug 69546 has been marked as a duplicate of this bug. ***
Changing description to "[RFE] Need console message when CheckLoadURI fails."
Summary: file:// urls from downloaded content aren't downloaded → [RFE] Need console message when CheckLoadURI fails
Target Milestone: Future → mozilla0.9
*** Bug 74747 has been marked as a duplicate of this bug. ***
*** Bug 75577 has been marked as a duplicate of this bug. ***
Fix checked in.
Status: ASSIGNED → RESOLVED
Closed: 23 years ago
Resolution: --- → FIXED
x86 linux 2001-04-18-08

I'm not seeing any sort of message being generated.
This bug does not appear to be fixed.

Where is the message supposed to appear?
What is the message supposed to look like?

And why don't I have the choice to re-open this bug?
Brad, if you go to this url and then click the link, you should see a message 
on the JavaScript console (Tasks->Tools->JavaScript Console).

data:text/html,<a href="file:///c|/autoexec.bat">c:\autoexec.bat
This is not a legitimate fix.

Users don't open up the javascript console to find error messages.
Especially when javascript doesn't even appear on the page!!!

The message needs to appear in the browser window itself,
possibly in the status bar at the bottom.

Bringing up an "about:security" page might not be a bad idea too.
It would then be impossible for a user to miss the message.
It would also allow us to display the rationale for not allowing
the user to go to the link, as well as ways to disable this feature.

Agree?  Disagree?
Brad, the message is mainly for web developers, not users. Web developers know
where to look for error messages, and if they see the message, they'll stop
using file:// links. Getting in the user's face with dialogs is bad, especially
when the fault lies with the content author, not the user.
That's just silly.

The people who really have the need to see the error message are the users!!!
The developers will already know what's going on.

A user will think that the link is bad, and complain to the webmaster.
And in my particular case, we're talking about an internal website,
were there is no security risk of having such a link.

> Getting in the user's face with dialogs is bad

No, having an expected action fail with no visible reason is bad.
A message in the status bar is not "in the user's face", it's reasonable.
More importantly, it's expected!

An "about:security" page is more in-your-face, but is still better than
simply "ignoring the click", from a user point of view.  And it's
equivalent to clicking on a "rotted" link and getting a 404 message on a
new page.
I agree that the user should see a message. The majority of web developers 
currently check their pages only with IE on Windows, which allows users to 
click on file:// links from web pages. Typically, it will be the users who try 
Mozilla who will see this problem first.

I'm not even sure that most web developers who do try their pages out with 
Mozilla know to look in the JavaScript console for error messages. I certainly 
didn't when I first encountered this problem and reported it as a bug.
I agree with Brad, a status bar message would be nice -- it's good for the user 
to know that there *is* an error on the page and that the page isn't working as 
its author intended.  I think that showing a status bar message for the 
CheckLoadURI message is covered by bug 47128, "Display JavaScript error 
indicator in status bar."

Depending on how bug 47128 is fixed, it might be necessary to change the 
message to a warning or error in order to make it show up.  Mitch, what do you 
think of making the CheckLoadURI message an error?  I think that would be 
consistent with how messages and errors are used for problems with javascript 
code.  The other "messages" I've seen are for deprecated, but working, methods.
Component: Networking → Networking: File
VERIFIED:
Win32, but not MacOS or LINUX. Does the the data: url provided act as a test
case for all plats, or do I actually need to point to a real file in each OS?

Changed summary to describe feature.

If we need to debate this further, please start a thread in the netlib
newsgroup, or file new bugs. I see two possible RFE's: domain based security and
logging to the normal console.
Summary: [RFE] Need console message when CheckLoadURI fails → security.checkURI logs file URL errors to JavaScript Console
Keywords: relnote, verifyme
Summary: security.checkURI logs file URL errors to JavaScript Console → security.checkloadURI logs file URL errors to JavaScript Console
*** Bug 89046 has been marked as a duplicate of this bug. ***
Status: RESOLVED → REOPENED
Resolution: FIXED → ---
I have a real existing file in intranet and a collegue sent me a *MESSSAGE* with
the file:/// link in it (see #89046) and it does not work in the news nightly
from yesterday (Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:0.9.2+)
Gecko/20010709)....on WinNT.
Upps. wrong prefs.js, sorry :-))) Close and forget ...
OK...
Status: REOPENED → RESOLVED
Closed: 23 years ago23 years ago
Resolution: --- → FIXED
*** Bug 89917 has been marked as a duplicate of this bug. ***
Bug 84128 is a request to report this error so end users can see it.

I think we are getting enough dupes where we need to put this at the top of list
of errors to be fixed.
Whiteboard: send post-fix dupes to bug 84128
*** Bug 91164 has been marked as a duplicate of this bug. ***
I'm not happy with that solution, as we can do better and more
secure, so view this as an reopening with request for enhancement:

Expected: Mozilla should check if local access rights apply
          (as it does in the url bar) and should load the
          pages accordingly. It should deny loading if access
          rights do not apply, regardless of whether the page
          containing the file:///link is loaded via file: or http:.

As (at least in Unix environments) it's easy to find out if
a user has access rights (when he/she is a user on the local
system), it should be possible to implement this finer 
granularity in security checking. The argument that it should 
prevent exploits is not valid since the possible exploiter
CAN SEE the link if it's on the page, even if it does not open,
and he CAN TYPE it into the url bar.
It's not the responsibility of Mozilla to assist in keeping 
weak sites alive, since the exploits are not through Mozilla's
weaknesses. The 'evil javascript' argument can not hold as a
reason because then you can deny access to and forbid almost everything 
using the same reasoning. Guys brave enough to turn javascript on should
be definitely on their own because there are MILLIONs of exploits
with that (personally I would kick out javascript completely out of
Mozilla since that's the biggest security hole in any browser !).
A secure system can open part of it's internal structure 
to the outside without being compromised (tautological definition
of 'secure site'). E.G., we are behind a firewall and extensively 
use the feature of accessing local files through pages loaded
via our local web server (documentation) with Netscape x.x, and
it works without having had any security problems with that.
By the way, nobody who has turned off javascript by default (as 
everyone should!) expects anything on a JavaScript Console....;-)
And, there should definitely be NO FLAG that opens local files to 
the outside ! Instead, implement REAL access rights checking, and we 
all will be happy again !

grabow: See Mitch's 2000-05-25 15:12 comments on this bug for why we disallow
all links from http:// to file:/// by default.
jesse:
See my comments on javashit ;-)

OK OK, I see we can not totally ignore the pure existence of this scrap ...
But is THAT really the way to go ? I would propose to switch the access
off ONLY if javascript is switched on (since that is the only applicable
reason to block access). That would solve all our problems, doesn't it ?
Again, in a more formal way:

file:///path/file is standard html content and is supposed
to work as described in the standard. Javascript is a 
nonstandard (hopefully forever) add-on. Therefore, if this
nonstandard add-on causes security problems in combination
with a standard W3C token, that problem should be solved
in the framework of the optional add-on, and not in a way
that blocks HTML standard conformance!

The current state is therefore that Mozilla IS NOT STANDARD CONFORMING !

(Or to say it clearer: How you "fixed" it is the wrong philosophy, guys !)

Therefore, please REOPEN for standard conformance.
grabow, you have completely misunderstood the security issue. Please read the
last 6 or 8 comments on bug 91316 for clarification.

If you argue that JavaScript should be removed, I guarantee that you will not be
taken seriously in any Mozilla forum. Javascript is a powerful technology, and
with power comes risk. IMHO, the risks are minimal and manageable. If you're
afraid of the risks inherent in rich interactive Web content, delete Mozilla and
go get Lynx. Meanwhile, we will continue to make JavaScript as safe as possible.
RELNOTE: NS6.1

"File URLs will not be read if they are inside a network based (HTTP) document.
To disable this feature, set "security.checkloadURI" to false in your prefs.js".
qa to me.
QA Contact: tever → benc
-> security
Component: Networking: File → Security: General
QA Contact: benc → bsharma
Verified on 2001-10-22-branch build on WinNT

Loaded the test case locally and through the web server, the behavior is as
expected.
Status: RESOLVED → VERIFIED
Wow, an amazing case of wrongthink.

I have a local html document on an internal website.
It makes reference to local network resources with a file:// url.
These links don't work.

This carries no security risk.  This is clearly broken.

The error messages are displayed in the JAVACSCRIPT console
even though there is no javascript on the pages in question.

Clearly the bug is that mozilla does not handle file:// urls correctly.
If you think this is unsafe, you should make mozilla throw up obnoxious
warnings in the same way it does in regards with leaving secure sites, etc.
The user should have a clear option to disable it.

I myself surf with javascript disabled, but yet my browser conformance
must suffer beceause you can't make a feature I don't use secure?

Get a grip people.
You need to log in before you can comment on or make changes to this bug.