Hi Dushan,

It is an optional mediator. We haven't touched the core (not a single line)

We will provide the performance results on Monday.

thanks,
Dimuthu


On Mon, Jan 15, 2018 at 10:26 PM, Dushan Abeyruwan <[email protected]> wrote:

> Hi
>  Pls provide the diff of the changes you have done.
>
> @ESB Team / PPT experts, since there are PPT level changes you need keep
> watch on performance impact, memory blueprint impact, how the heap usage
> varies per message size since  (smallest to the largest) + per how the
> behavior for complex interaction which has clone/iterators etc etc.
>
> Cheers,
> Dushan
>
> On Tue, Jan 9, 2018 at 9:38 AM, Hasunie Adikari <[email protected]> wrote:
>
>> Hi all,
>>
>> As I discussed with Isuru, There are some possible approaches to overcome
>> the issue.
>>
>> 1. Create a new pass through pipe.
>>    - The data will be written to the pipe by a spawned thread and current
>> thread will be consuming the data and continuing the message flow. We went
>> through the pipe creation logic and seemed it tightly coupled with
>> encoding, decoding methodologies so that it can't be
>>       implemented at APIM level.
>>
>> 2. Change the synapse level logic to get the ByteArrayInputstream and
>> write it into the response.
>>    - It can be but have to thoroughly go through and do it carefully
>> unless the default message flow would be affected.
>>
>> 3. Build the message by invoking RelayUtils.buildMessage() at the
>> validator mediator after successfully parsing all the validators.
>>     - It will be slightly affected the performance but this is the
>> straightforward solution at this moment.
>>
>> I have improved the code by applying the 3rd option as we discussed.
>> Setting the PassThroughConstants.BUFFERED_INPUT_STREAM has an effect now
>> onwards since we changed a way that building the message to achieve the
>> content aware behavior which seeks the
>> inputream from the axis2 message context instead of the original
>> inputstream.
>>
>>
>> Regards
>> Hasunie
>>
>>
>>
>> On Tue, Jan 9, 2018 at 4:41 PM, Isuru Udana <[email protected]> wrote:
>>
>>> Hi Hasunie,
>>>
>>> As we discussed, setting the PassThroughConstants.BUFFERED_INPUT_STREAM
>>> has no effect on the flow in this case and Passthough Sender still seek
>>> content from the original input stream which got empty due to this cloning
>>> logic. That's the reason for this behaviour.
>>>
>>> Thanks.
>>>
>>>
>>>
>>> On Tue, Jan 9, 2018 at 11:43 AM, Hasunie Adikari <[email protected]>
>>> wrote:
>>>
>>>> Hi Isuru,
>>>>
>>>> As we discussed, I cloned the input stream by consuming the passthrough
>>>> pipe as in below.
>>>>
>>>>
>>>> if (pipe != null) {
>>>>             bufferedInputStream = new BufferedInputStream(pipe.getIn
>>>> putStream());
>>>>
>>>>         }
>>>> ByteArrayOutputStream byteArrayOutputStream = new
>>>> ByteArrayOutputStream();
>>>> byte[] buffer = new byte[1024];
>>>> int len;
>>>> while ((len = bufferedInputStream.read(buffer)) > -1 ) {
>>>>     byteArrayOutputStream.write(buffer, 0, len);
>>>> }
>>>> byteArrayOutputStream.flush();
>>>>
>>>>
>>>> InputStream is1 = new ByteArrayInputStream(byteArray
>>>> OutputStream.toByteArray());
>>>> InputStream is2 = new ByteArrayInputStream(byteArray
>>>> OutputStream.toByteArray());
>>>>
>>>> consume the clones for the validation and set another clone as a
>>>> buffereInputstream property in the axis2messagecontext.
>>>>
>>>> BufferedInputStream bufferedInputStreamOriginal = new
>>>> BufferedInputStream(inputStreamOriginal);
>>>> axis2MC.setProperty(PassThroughConstants.BUFFERED_INPUT_STREAM,
>>>> bufferedInputStreamOriginal);
>>>>
>>>> I'm still getting the stream closed issue only for correct the messages
>>>> which have been passed through multiple validators. If the validators throw
>>>> an exception, the request is getting build and generate the custom response
>>>> as expected. It seems like we implemented a way that gets the
>>>> inputstream from the passthrough pipe for the content unaware flows.
>>>> Unless it uses to get the inputstream from the messagecontext. It was
>>>> proven once I attached an empty content aware mediator and test the
>>>> same flow. I was able to observe the expected behaviour for the same
>>>> implementation with the content aware mediator.
>>>>
>>>> Do we have a way to define cloned input stream as an original
>>>> inputstream in passthrough pipe?
>>>>
>>>>
>>>> Regards
>>>> Hasunie
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Wed, Jan 3, 2018 at 9:21 AM, Isuru Udana <[email protected]> wrote:
>>>>
>>>>> Hi Dushan,
>>>>>
>>>>> On Wed, Jan 3, 2018 at 9:06 AM, Dushan Abeyruwan <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> Hi Hasunie,
>>>>>>   Current PTT design would build the message whenever if there is
>>>>>> content aware mediator available. However IIRC, I did this 
>>>>>> *message.builder.the
>>>>>> invoked* thing to cope with the WSO2 ELB we had (a few years ago).
>>>>>>
>>>>> No. I think it was *force.passthrough.builder *property which you
>>>>> introduced for ELB requirement.
>>>>>
>>>>> To be honest, that looks ugly isn it (in terms of overall picture).
>>>>>> Basically, what it does; even if there are content-aware mediators, the
>>>>>> engine would forcefully ignore that (it was ELB requirement :) ) but for
>>>>>> APIM I don't think that would be the same, cos we may have to deal with
>>>>>> many use cases sometimes of cause with content aware flows with API
>>>>>> compositions etc etc.
>>>>>>
>>>>>> So, let's think what we can do here; regex and XML threat protectors
>>>>>> equally important if security is priority thus,  we would no longer able 
>>>>>> to
>>>>>> achieve the same core basic aspect (content none awareness) because, such
>>>>>> protections required you to walk through the nodes and verify some 
>>>>>> aspects
>>>>>> (basically, you need to expand the xml node tree to get result set) in 
>>>>>> that
>>>>>> way, it is required the message to be build. Anyway, what I would think 
>>>>>> the
>>>>>> best approach here is not to change complete synapse content awareness
>>>>>> logic rather I would think you may have mediator in place but only if 
>>>>>> such
>>>>>> protection engaged that may build the message to get XML inforset (rather
>>>>>> build through root, may be you can mark this meditor as content-aware
>>>>>> false, then build if message not already build prior to process)
>>>>>>
>>>>>> IMO, lets just not complicate the what we try to build around message
>>>>>> validation. I mean if we need such protection we may need to sacrify some
>>>>>> aspects am I?
>>>>>>
>>>>>> Cheers,
>>>>>> Dushan
>>>>>>
>>>>>> On Tue, Jan 2, 2018 at 8:08 AM, Vinod Kavinda <[email protected]> wrote:
>>>>>>
>>>>>>> Hi Hasunie,
>>>>>>>
>>>>>>> This is expected since the synapse engine now expecting an already
>>>>>>> built message. If I understood your requirement correctly, one option 
>>>>>>> is to
>>>>>>> use a Builder Mediator before using any content aware mediator. Even 
>>>>>>> though
>>>>>>> we do not recommend the Builder mediators now, still we can use it for 
>>>>>>> your
>>>>>>> specific use case. Or you have to revert the
>>>>>>> *message.builder.invoked *property to *false *again*.*
>>>>>>>
>>>>>>> Regards,
>>>>>>> Vinod
>>>>>>>
>>>>>>> On Tue, Jan 2, 2018 at 5:22 PM, Hasunie Adikari <[email protected]>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> I'm trying to combine SQL injection(Regex) threat protector with
>>>>>>>> the XML threat protector. So I created a sequence[1] with
>>>>>>>> XMLthreatprotector mediator and regex mediator consecutively and 
>>>>>>>> uploaded
>>>>>>>> it to be able to validate the request message through both the
>>>>>>>> xml validator and regex validators. If I set the
>>>>>>>> *message.builder.invoked *property to *TRUE *in xml validator
>>>>>>>> mediator to avoid sending the content in pass-through pipe(request
>>>>>>>> message) as the response, Regex mediators is getting failed. The regex
>>>>>>>> mediator was designed a way that the incoming messages are built in 
>>>>>>>> synapse
>>>>>>>> level and eveluate the message content at the mediator level. It
>>>>>>>> seems like we can't continue any mediators which are required to get 
>>>>>>>> the
>>>>>>>> message content, after we manually set the aforementioned property to 
>>>>>>>> true
>>>>>>>> in the previous mediator. If I set it to true, RelayUtill will skip
>>>>>>>> building the message as in here [2]. Any thoughts regarding the issue.
>>>>>>>> I'm currently working on the issue to be able to combine regex and XML
>>>>>>>> threat protectors.
>>>>>>>> [2]
>>>>>>>>
>>>>>>>> if (pipe != null
>>>>>>>>     && !Boolean.TRUE.equals(messageContext
>>>>>>>>                                     
>>>>>>>> .getProperty(PassThroughConstants.MESSAGE_BUILDER_INVOKED)) && 
>>>>>>>> forcePTBuild) {
>>>>>>>>     InputStream in = pipe.getInputStream();
>>>>>>>>
>>>>>>>>     Object http_sc = 
>>>>>>>> messageContext.getProperty(NhttpConstants.HTTP_SC);
>>>>>>>>     if (http_sc != null && http_sc instanceof Integer && 
>>>>>>>> http_sc.equals(202)) {
>>>>>>>>         
>>>>>>>> messageContext.setProperty(PassThroughConstants.MESSAGE_BUILDER_INVOKED,
>>>>>>>>                                    Boolean.TRUE);
>>>>>>>>         return;
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     builldMessage(messageContext, earlyBuild, in);
>>>>>>>>     return;
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> [1]
>>>>>>>> <sequence xmlns="http://ws.apache.org/ns/synapse"; name="validator">
>>>>>>>>     <property name="threatType" expression="get-property('threatType')"
>>>>>>>> value="SQL-Injection and XML validator"/>
>>>>>>>>     <property>
>>>>>>>>     <property>
>>>>>>>>      --------
>>>>>>>>     <switch source="get-property('To')">
>>>>>>>>        --------------
>>>>>>>>     </switch>
>>>>>>>>     *<class
>>>>>>>> name="org.wso2.carbon.apimgt.gateway.mediators.XMLSchemaValidator"/>*
>>>>>>>>     <property name="enabledCheckPathParams"
>>>>>>>> expression="get-property('enabledCheckPathParams')" value="true"/>
>>>>>>>>     <property>
>>>>>>>>     <property>
>>>>>>>>      --
>>>>>>>>     *<class
>>>>>>>> name="org.wso2.carbon.apimgt.gateway.mediators.RegularExpressionProtector"/>*
>>>>>>>>     <filter source="get-property('threat')" regex=".*error.*">
>>>>>>>>         <then>
>>>>>>>>             <sequence key="_threat_fault_"></sequence>
>>>>>>>>         </then>
>>>>>>>>     </filter>
>>>>>>>> </sequence>
>>>>>>>>
>>>>>>>> Regards
>>>>>>>> Hasunie
>>>>>>>>
>>>>>>>> On Fri, Dec 22, 2017 at 5:14 PM, Hasunie Adikari <[email protected]>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> Hi all,
>>>>>>>>>
>>>>>>>>> I'm working on threat protector feature in APIM. We're actually
>>>>>>>>> trying to achieve here is to protect both backend resources and 
>>>>>>>>> gateway
>>>>>>>>> from the XML and JSON based attacks. The Balerina based APIM 3 
>>>>>>>>> gateway will
>>>>>>>>> be protected by threat handlers. But In here
>>>>>>>>> APIM 2.1.x we have implemented mediators to achieve it.
>>>>>>>>>
>>>>>>>>> If we allow building the request message at the synapse level, It
>>>>>>>>> will definitely affect the gateway, All the request messages which go
>>>>>>>>> through the mediators are built since the Abstarctemediator is 
>>>>>>>>> designed a
>>>>>>>>> way that the isContentAware method always returns true. So we set it 
>>>>>>>>> to
>>>>>>>>> false in both XML and JSON validator mediators and allow to parse the
>>>>>>>>> XML request via a third party StAX parser called woodstox hence it 
>>>>>>>>> was the
>>>>>>>>> best option among other StAX parsers for threat protection features. 
>>>>>>>>> It
>>>>>>>>> will keep counting the given limits and when the limit is exceeded, 
>>>>>>>>> It will
>>>>>>>>> terminate the process and throw a meaningful exception. I have 
>>>>>>>>> created a
>>>>>>>>> custom threat sequence(thrat_fault) and If a threat is detected by 
>>>>>>>>> getting
>>>>>>>>> an exception I configured to direct the response through the custom 
>>>>>>>>> error
>>>>>>>>> sequence.
>>>>>>>>> I reuse the same custom sequence which was implemented for the
>>>>>>>>> regex threat protector [1]
>>>>>>>>>
>>>>>>>>> Woodstox parser covers most of the vulnerabilities as in here
>>>>>>>>>
>>>>>>>>> *Vulnerablity:*
>>>>>>>>>
>>>>>>>>> *xml bomb* - DTD disabling
>>>>>>>>>
>>>>>>>>> *external entity attack* - disabling external entities.
>>>>>>>>>
>>>>>>>>> Note :
>>>>>>>>> Apart from the mediator level, The external entity
>>>>>>>>> reference property was disabled from the DOM parsers at the synapse 
>>>>>>>>> level
>>>>>>>>> as well.
>>>>>>>>>
>>>>>>>>> import org.apache.xerces.impl.Constants;
>>>>>>>>>
>>>>>>>>> private static final int ENTITY_EXPANSION_LIMIT = 0;
>>>>>>>>> private static final DocumentBuilderFactory
>>>>>>>>> documentBuilderFactory =
>>>>>>>>>    DocumentBuilderFactory.newInstance();
>>>>>>>>>
>>>>>>>>> static {
>>>>>>>>>    documentBuilderFactory.setNamespaceAware(true);
>>>>>>>>>    documentBuilderFactory.setXIncludeAware(false);
>>>>>>>>>    documentBuilderFactory.setExpandEntityReferences(false);
>>>>>>>>>
>>>>>>>>>    try {
>>>>>>>>>        documentBuilderFactory.setFeature(Constants.SAX_FEATU
>>>>>>>>> RE_PREFIX +
>>>>>>>>>            Constants.EXTERNAL_GENERAL_ENTITIES_FEATURE, false);
>>>>>>>>>    } catch (ParserConfigurationException e) {
>>>>>>>>>
>>>>>>>>> *Buffer overflow attack* - by limiting the count of elements,
>>>>>>>>> children and length of attributes/keys/values.
>>>>>>>>>
>>>>>>>>> *woodstox properties:*
>>>>>>>>> dtdEnabled
>>>>>>>>> externalEntitiesEnabled
>>>>>>>>> maxDepth
>>>>>>>>> maxElementCount
>>>>>>>>> maxAttributeCount
>>>>>>>>> maxAttributeLength
>>>>>>>>> entityExpansionLimit
>>>>>>>>> maxChildrenPerElement
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> For thwart cohesive attacks, we use both schema validator and
>>>>>>>>> depth limits. Ideally, only the woodstox validator should detect the
>>>>>>>>> cohesive attacks by exceeding the defined depth limit. But the schema
>>>>>>>>> validator will protect the schema poising attacks in the second step 
>>>>>>>>> as
>>>>>>>>> well.
>>>>>>>>>
>>>>>>>>> I observed an issue when It comes to combining each
>>>>>>>>> other(woodstox+ schema validator). We have designed the feature in 
>>>>>>>>> such a
>>>>>>>>> way that gets the inputstream from the message context and consumes 
>>>>>>>>> it in
>>>>>>>>> the woodstox validator. but in here we have to consume the input 
>>>>>>>>> stream
>>>>>>>>> again for the schema validation just after passing through the
>>>>>>>>> woodstox.That was the issue and I tried the following methodologies to
>>>>>>>>> resolved the issue
>>>>>>>>>
>>>>>>>>> 1. try to get the XML object from the woodstox parser to be able
>>>>>>>>> to avoid using the input stream again.
>>>>>>>>> 2. deep clone the inputstream and use cloned input stream for the
>>>>>>>>> schema validation.
>>>>>>>>> 3. reset, mark the buffered input stream(synapse engine also has
>>>>>>>>> done rest, mark)
>>>>>>>>>
>>>>>>>>> 1st one was taken time and much complex to get the XML object
>>>>>>>>> since Woodstock is based on the StAX parsers and also deep cloning 
>>>>>>>>> was not
>>>>>>>>> working properly and experienced the same issue after cloning the
>>>>>>>>> inputstream. But the 3rd option makes life easy so I implemented a 
>>>>>>>>> way that
>>>>>>>>> returning the buffered input stream, after doing the rest, mark,  
>>>>>>>>> then It
>>>>>>>>> works properly. I went through the RelayUtil message builders [2] and 
>>>>>>>>> It
>>>>>>>>> also uses the mark and reset methodology and return InputStream.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> I observed another issue once the validator throws an exception,
>>>>>>>>> the server hanged and didn't get any response and getting timeout 
>>>>>>>>> issue. I
>>>>>>>>> was able to figure it out and Issue occurred while trying to build the
>>>>>>>>> request message in Relayutil.buildmessage().But Ideally, If we get an 
>>>>>>>>> error
>>>>>>>>> we don't need the request message anymore. As I discussed offline 
>>>>>>>>> with the
>>>>>>>>> APIM team, I used the *consumeAndDiscardMessage* method to
>>>>>>>>> discard the request message from the message context and set 
>>>>>>>>> *message.builder.invoked
>>>>>>>>> *property to *TRUE. *It needs to be set to avoid sending the
>>>>>>>>> content in pass-through pipe (request message) as the response.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> [1] https://docs.wso2.com/display/AM210/Regular+Expression+T
>>>>>>>>> hreat+Protection+for+API+Gateway
>>>>>>>>> [2] https://github.com/wso2/wso2-synapse/blob/master/modules
>>>>>>>>> /transports/core/nhttp/src/main/java/org/apache/synapse/tran
>>>>>>>>> sport/passthru/util/RelayUtils.java#L121
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Regards
>>>>>>>>> Hasunie
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> *Hasunie Adikari*
>>>>>>>>> Senior Software Engineer
>>>>>>>>> WSO2 Inc.; http://wso2.com
>>>>>>>>> lean.enterprise.middleware
>>>>>>>>> blog http://hasuniea.blogspot.com | https://medium.com/@Hasunie/
>>>>>>>>> Mobile:+94713095876 <+94%2071%20309%205876>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Hasunie Adikari*
>>>>>>>> Senior Software Engineer
>>>>>>>> WSO2 Inc.; http://wso2.com
>>>>>>>> lean.enterprise.middleware
>>>>>>>> blog http://hasuniea.blogspot.com | https://medium.com/@Hasunie/
>>>>>>>> Mobile:+94713095876 <+94%2071%20309%205876>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Vinod Kavinda
>>>>>>> Senior Software Engineer
>>>>>>> *WSO2 Inc. - lean . enterprise . middleware <http://www.wso2.com>.*
>>>>>>> Mobile : +94 (0) 712 415544
>>>>>>> Blog : http://soatechflicks.blogspot.com/
>>>>>>> [image: http://wso2.com/signature]
>>>>>>> <http://wso2.com/signature>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Dushan Abeyruwan | Architect
>>>>>> Technical Support,MV
>>>>>> PMC Member Apache Synpase
>>>>>> WSO2 Inc. http://wso2.com/
>>>>>> Blog:*http://www.dushantech.com/ <http://www.dushantech.com/>*
>>>>>> LinkedIn:*https://www.linkedin.com/in/dushanabeyruwan
>>>>>> <https://www.linkedin.com/in/dushanabeyruwan>*
>>>>>> Mobile:(001)408-791-9312 <+1%20408-791-9312>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Isuru Udana*
>>>>> Senior Technical Lead
>>>>> WSO2 Inc.; http://wso2.com
>>>>> email: [email protected] cell: +94 77 3791887 <+94%2077%20379%201887>
>>>>> blog: http://mytecheye.blogspot.com/
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> *Hasunie Adikari*
>>>> Senior Software Engineer
>>>> WSO2 Inc.; http://wso2.com
>>>> lean.enterprise.middleware
>>>> blog http://hasuniea.blogspot.com | https://medium.com/@Hasunie/
>>>> Mobile:+94713095876 <071%20309%205876>
>>>>
>>>>
>>>
>>>
>>> --
>>> *Isuru Udana*
>>> Senior Technical Lead
>>> WSO2 Inc.; http://wso2.com
>>> email: [email protected] cell: +94 77 3791887 <+94%2077%20379%201887>
>>> blog: http://mytecheye.blogspot.com/
>>>
>>
>>
>>
>> --
>> *Hasunie Adikari*
>> Senior Software Engineer
>> WSO2 Inc.; http://wso2.com
>> lean.enterprise.middleware
>> blog http://hasuniea.blogspot.com | https://medium.com/@Hasunie/
>> Mobile:+94713095876 <+94%2071%20309%205876>
>>
>>
>
>
> --
> Dushan Abeyruwan | Architect
> Technical Support,MV
> PMC Member Apache Synpase
> WSO2 Inc. http://wso2.com/
> Blog:*http://www.dushantech.com/ <http://www.dushantech.com/>*
> LinkedIn:*https://www.linkedin.com/in/dushanabeyruwan
> <https://www.linkedin.com/in/dushanabeyruwan>*
> Mobile:(001)408-791-9312 <+1%20408-791-9312>
>
>


-- 
Dimuthu Leelarathne
Director, Solutions Architecture

WSO2, Inc. (http://wso2.com)
email: [email protected]
Mobile: +94773661935
Blog: http://muthulee.blogspot.com

Lean . Enterprise . Middleware
_______________________________________________
Architecture mailing list
[email protected]
https://mail.wso2.org/cgi-bin/mailman/listinfo/architecture

Reply via email to