Le 25/01/2016 21:26, Scott Gray a écrit :
Actually upon reflection, I think I see the vulnerability.  We'd need to do
a third thing if we don't it already:
1. Once a user is on HTTPS they must be kept on HTTPS

Actually, as Ron explained, we need to use only HTTPS or only HTTP. I will try 
to convince you :)
Note: that HTTP only is only good for sites where you don't identify users

2. Generate a new session when they switch to HTTPS

This is not enough as I tried to explain

3. Generate a new session when they login

Still the man in the middle possibility, because of open HTTP provided

Jacques




On 26 January 2016 at 09:08, Scott Gray <scott.g...@hotwaxsystems.com>
wrote:

I'm not sure why you included that stuff about the demo server, it didn't
seem relevant.

Regarding your doubts on #2, in the first article you linked to, I point
you to this sentence:
"This attack will work, provided that there is no session regeneration in
the application after successful login."

Suggestion #2 specifically stated that we should regenerate the session
when the user switches to HTTPS.  The user or attacker can provide any
token they like during HTTP but it will never become the HTTPS session.

Regards
Scott

On 26 January 2016 at 03:57, Jacques Le Roux <jacques.le.r...@les7arts.com
wrote:
Thanks for taking care Scott (even if you did not read the full stuff, I
guess you are not alone ;))

Took me some time to answer, for misc. reasons, notably looking into
details... Yes there is a bit more to it...

I totally agree with your point 1. For instance this is dangerous in
ProductSubTabBar
     <link target="/ecommerce/control/product" url-mode="inter-app">

OK, I think I will scramble the situation a bit more, and this is not a
security problem, but it will help me to explain.

If you get to

https://demo-stable-ofbiz.apache.org/catalog/control/EditProduct?productId=GZ-1000
and click on the "Product Page" link you will get an error because the
ASF front-end/reverse-proxy we use for demos introduces the 18080 port we
ask for (in url.properties) for HTTP links in URLs.

Now weirdly if you get back to

https://demo-stable-ofbiz.apache.org/catalog/control/EditProduct?productId=GZ-1000
and try the link again, it will work. This is because we now put the
strict-transport-security header
https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security#HSTS_mechanism_overview
.
So "it" (rather the user's browser) transforms the call to the ecommerce
"product" request to a secured request. But there is even a better way, and
it's a simple as that:

ofbizDemo@ofbiz-vm:~/trunk$ svn di
specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml
Index: specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml
===================================================================
--- specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml
(revision 1725169)
+++ specialpurpose/ecommerce/webapp/ecommerce/WEB-INF/controller.xml
(working copy)
@@ -860,7 +860,7 @@
          <response name="success" type="view" value="category"
save-current-view="true"/>
      </request-map>
      <request-map uri="product">
-        <security https="false" auth="false"/>
+        <security https="true" auth="false"/>
          <response name="success" type="view" value="product"
save-current-view="true"/>
      </request-map>
      <request-map uri="detailImage">
ofbizDemo@ofbiz-vm:~/trunk$

This is why you don't have this issue (link to ecommerce product from
catalog) when looking the same in trunk demo.
For my tests I applied the patch above there (the proxy already gave me
some headaches)

But of course there is an easier way to automate that:
Index: config/url.properties
===================================================================
--- config/url.properties    (revision 1725003)
+++ config/url.properties    (working copy)
@@ -26,6 +26,7 @@
  force.https.host=

  # HTTP Port (Not Secure port)
+no.http=Y
  port.http=8080
  force.http.host=

Index: src/org/ofbiz/webapp/control/ConfigXMLReader.java
===================================================================
--- src/org/ofbiz/webapp/control/ConfigXMLReader.java    (revision
1725003)
+++ src/org/ofbiz/webapp/control/ConfigXMLReader.java    (working copy)
@@ -41,6 +41,7 @@
  import org.ofbiz.base.util.FileUtil;
  import org.ofbiz.base.util.GeneralException;
  import org.ofbiz.base.util.UtilHttp;
+import org.ofbiz.base.util.UtilProperties;
  import org.ofbiz.base.util.UtilValidate;
  import org.ofbiz.base.util.UtilXml;
  import org.ofbiz.base.util.cache.UtilCache;
@@ -527,7 +528,7 @@
          public boolean trackServerHit = true;
          public String description;
          public Event event;
-        public boolean securityHttps = false;
+        public boolean securityHttps = true;
          public boolean securityAuth = false;
          public boolean securityCert = false;
          public boolean securityExternalView = true;
@@ -544,7 +545,9 @@
              // Check for security
              Element securityElement =
UtilXml.firstChildElement(requestMapElement, "security");
              if (securityElement != null) {
-                this.securityHttps =
"true".equals(securityElement.getAttribute("https"));
+                if (!UtilProperties.propertyValueEqualsIgnoreCase("url",
"no.http", "Y")) {
+                    this.securityHttps =
"true".equals(securityElement.getAttribute("https"));
+                }
                  this.securityAuth =
"true".equals(securityElement.getAttribute("auth"));
                  this.securityCert =
"true".equals(securityElement.getAttribute("cert"));
                  this.securityExternalView =
!"false".equals(securityElement.getAttribute("external-view"));

And this is the change I propose. To not blur things more in this post, I
created https://issues.apache.org/jira/browse/OFBIZ-6849 please refer to
it for details.

Also your point 2 is not enough and maybe my 1st post was a bit
overwhelming and certainly not sufficiently clear. So let me try to
summarize.
Actually, as
http://resources.infosecinstitute.com/cookies-secure-flag-undesired-behavior-modern-browsers,
very well explains, if you use HTTP in a webapp where sessions are also
used, a "man in the middle" attack can create a cookie with its own
sessionid value and the secure header set. The attacker can then use this
cookie to force his own session in HTTPS mode or force an user to use the
attacker's account.

BTW this is detailled in RFC 6265 (section 4.1.2.5), part of it:

<<An active network attacker can overwrite Secure cookies from an
insecure channel, disrupting their integrity (see Section 8.6 <
https://tools.ietf.org/html/rfc6265#section-8.6> for more details).>>

part of section 8.6

<<An active network attacker can also inject cookies into the Cookie
    header sent tohttps://example.com/  by impersonating a response from
    http://example.com/  and injecting a Set-Cookie header.  The HTTPS
    server at example.com will be unable to distinguish these cookies
    from cookies that it set itself in an HTTPS response.  An active
    network attacker might be able to leverage this ability to mount an
    attack against example.com even if example.com uses HTTPS
    exclusively.>>

The infosecinstitute article is short enough to be worth reading, at
least the summary :).
This supposes the attacker controls the communication channel, but we
should not be sure this will never happen, and quite the opposite, be ready
to face it.
It's a lame comparison but roughly: HTTPS is, for security, similar to
what immutability is for  thread-safe. Now let's see why you would want
HTTP.

In this article
http://arstechnica.com/business/2011/03/https-is-more-secure-so-why-isnt-the-web-using-it/,
it's said:
<<The real problem, according to Lafon [one of the resident experts on
HTTP(s) at the W3C], is that with HTTPS you lose the ability to cache. "Not
really an issue when servers and clients are in the same region (meaning
continent)," writes Lafon in an e-mail to Webmonkey, "but people in
Australia (for example) love when something can be cached and served
without a huge response time.">> Note that this *from 2011*, but I guess
still pertinent. Most of the time it's not a problem and should not hinder
to generalize, moreover as suggested above though default HTTPS would be
optional for all the requests currently not using.

All the other reasons are weak or obsolete, I'll quickly review them in
OFBIZ-6849.

I'm very sorry for the length of this email. I wanted to answer you as
concisely as possible, not sure I succeeded. I hope it finally makes sense,
else OFBIZ-6849 an related tasks should.

Jacques


Le 03/01/2016 00:59, Scott Gray a écrit :

I'm too lazy to read all the links but I think we can make some
straightforward changes to improve the situation:
1. Once a user is on https, all links generated should use https
2. If a user is on http, then that's fine and we just need to ensure that
when they switch to https (during login or any other sensitive
activities)
that we're able to transfer any existing session information over to a
secure session with a new session id.

Is there any more to it?

Regards
Scott

On 3 January 2016 at 12:14, Jacques Le Roux<jacques.le.r...@les7arts.com
wrote:

Hi,
You maybe noticed that I began to work on securing and keeping OFBiz
secured better by proposing tools to use and share with the community
https://cwiki.apache.org/confluence/display/OFBIZ/Keeping+OFBiz+secure

This started after I was confronted with the "The 2015 infamous Java
unserialize vulnerability". As explained in the wiki page, there were
also
3 other points I wanted to address:

   * Java<

https://cwiki.apache.org/confluence/display/OFBIZ/About+OWASP+Dependency+Check
   * JavaScript<
https://cwiki.apache.org/confluence/display/OFBIZ/About+retire.js>
   * HTTP headers<https://cyh.herokuapp.com/cyh>

I already worked in end of 2013 on updating 3rd party Java lib OFBiz
depends on. It's a tedious work but mostly without surprises, it's only
a
matter of rightly upgrading external libs (as much as we can).

I decided to postpone the work on JavaScript libs (it's tedious and
mostly
straigthforward as well) because I thought that resolving the issues on
HTTP headers would be much simpler and it was new to me (more fun). So
far
I also thought it was a minor point regarding security. I was wrong!
OK, it
gets now a bit more complicated, I will try my best to explain in as
less
as possible words.

I did not cross much issues, until I began to work on securing cookies.
I
committed r1719762 when I decided I should have a look at OFBIZ-6655. I
then reverted r1719762 and tried to commit the proposed patches there,
but
finally reverted them because of an issue in ecommerce and reapplied
r1719762. Then Pierre Smits noticed an issue on trunk demo in
ecommerce. To
solve it I naively created
https://issues.apache.org/jira/browse/INFRA-10973  and dug the wrong
way.
Then Deepak called me because he found an issue with r1719762 and we
decided we should revert, and he did at r1722379 (I did not get a chance
yet to check, but I trust Deepak).

I was writing this email (for few hours) when Scott just wrote

https://issues.apache.org/jira/browse/OFBIZ-6111?focusedCommentId=15076677
,
and I agree with him.

But that's not the whole point of this email. While working on securing
cookies, I stumbled upon this blog post

http://resources.infosecinstitute.com/cookies-secure-flag-undesired-behavior-modern-browsers/
.
Long story short, you can't have the cake and eat it too. Or rather you
can't use HTTP and be secure if you also use sessions (this is what
OFBiz
ecommerce does). I wrote in the title about "Performance over security".
Because the only remaining reason nowadays people would want HTTP is for
performance caching adds.
There is some good articles about that:


http://arstechnica.com/business/2011/03/https-is-more-secure-so-why-isnt-the-web-using-it/


https://stackoverflow.com/questions/2746047/why-not-use-https-for-everything


https://security.stackexchange.com/questions/4369/why-is-https-not-the-default-protocol

To summarize with letsencrypt
https://community.letsencrypt.org/t/frequently-asked-questions-faq
and  Server Name Indication
      https://en.wikipedia.org/wiki/Server_Name_Indication


https://www.networking4all.com/en/ssl+certificates/faq/server+name+indication/
most of the other concerns are off (we use TLS for a while now in OFBiz)

So I'd like to remove, or rather make optional, HTTP in OFBiz. Though I
did not check technical detail yet, people who really prefer performance
over security would be able to use it through a properties in
url.properties.

You should be interested by

https://www.owasp.org/index.php/Top_10_2013-A2-Broken_Authentication_and_Session_Management
as well

Opinions?

Jacques
PS: nobody knows what really happened to Ian Murdock (it's blurred in
news, I know his family wants discretion)?



Reply via email to