Jacques Le Roux created OFBIZ-12587:
---------------------------------------

             Summary: Implement Freemarker WhitelistMemberAccessPolicy
                 Key: OFBIZ-12587
                 URL: https://issues.apache.org/jira/browse/OFBIZ-12587
             Project: OFBiz
          Issue Type: Improvement
          Components: ALL APPLICATIONS, ALL PLUGINS, framework/base, 
framework/security
    Affects Versions: Upcoming Branch
            Reporter: Jacques Le Roux
            Assignee: Jacques Le Roux


In its API, Freemarker provides 
[WhitelistMemberAccessPolicy|https://freemarker.apache.org/docs/api/freemarker/ext/beans/WhitelistMemberAccessPolicy.html]
 where it mentions 
[TemplateAccessible|https://freemarker.apache.org/docs/api/freemarker/ext/beans/TemplateAccessible.html]
 and there says:
bq. Note that adding something to the whitelist doesn't necessary make it 
visible from templates; see WhitelistMemberAccessPolicy documentation.

So back to [WhitelistMemberAccessPolicy 
API|https://freemarker.apache.org/docs/api/freemarker/ext/beans/WhitelistMemberAccessPolicy.html]
 documentation says 2 things:
bq. Of course, this only can deal with the ObjectWrapper aspect of safety; 
please check the Manual to see what else is needed.

So far, I did not find any other documentation than the 
[WhitelistMemberAccessPolicy 
API|https://freemarker.apache.org/docs/api/freemarker/ext/beans/WhitelistMemberAccessPolicy.html]
 but the FAQ (see below). In the [WhitelistMemberAccessPolicy 
API|https://freemarker.apache.org/docs/api/freemarker/ext/beans/WhitelistMemberAccessPolicy.html]
 I read
bq.  Also, since this is related to security, read the documentation of 
MemberAccessPolicy, to know about the pitfalls and edge cases related to 
MemberAccessPolicy-es in general.
So maybe I miss something somewhere.

Something else is interesting in [WhitelistMemberAccessPolicy 
API|https://freemarker.apache.org/docs/api/freemarker/ext/beans/WhitelistMemberAccessPolicy.html]:
bq. Note that if you add TemplateModel-s directly to the data-model, those are 
not wrapped by the ObjectWrapper (from Configurable.getObjectWrapper()), and so 
the MemberAccessPolicy won't affect those.

So WhitelistMemberAccessPolicy is not a magic wand, more must be done. The 
[FAQ|https://freemarker.apache.org/docs/app_faq.html#faq_template_uploading_security]
 should be of some help. Notably in OFBiz case:
bq. Always expect that templates may get some objects that you haven't put into 
the data-model yourself. Notably, templates can always get a Locale object with 
the .locale_object expression. Or the {color:#ff8b00}web application framework 
you are using may exposes some objects, like attributes from the Servlet 
scopes{color}. Such objects will be still wrapped with the ObjectWrapper that 
you set in the Configuration, and this is why it's important to ensure safety 
on that level. Controlling what objects the template will have access to is 
hard, but you can control centrally what members of any object they have access 
to.

This also needs to taken in consideration:
bq. Template-loader (Configuration.setTemplateLoader): Templates may load other 
templates by name (by path), like <#include "../secret.txt">. To avoid loading 
sensitive data, you have to use a TemplateLoader that double-checks that the 
file to load is something that should be exposed. FreeMarker tries to prevent 
the loading of files outside the template root directory regardless of template 
loader, but depending on the underlying storage mechanism, exploits may exist 
that FreeMarker can't consider (like, just as an example, ~ jumps to the 
current user's home directory). Note that freemarker.cache.FileTemplateLoader 
checks the canonical paths, so that's maybe a good candidate for this task, 
yet, adding a file extension check (file must be *.ftl) is maybe a good idea.




--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to