Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Upgrading dependencies to use static-eval 2 in cwise by archmoj · Pull Request #25 · scijs/cwise · GitHub
Skip to content

Upgrading dependencies to use static-eval 2 in cwise - #25

Open
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep
Open

Upgrading dependencies to use static-eval 2 in cwise#25
archmoj wants to merge 10 commits into
scijs:masterfrom
archmoj:upgrade-dep

Conversation

@archmoj

@archmojarchmoj commented Nov 21, 2018

Copy link
Copy Markdown

This PR resolves https://www.npmjs.com/advisories/548.
It is also tested on a Plotly PR in different modules namely ndarray-fill.

@etpinard

etpinard commented Nov 21, 2018

Copy link
Copy Markdown
Contributor

@archmoj could you patch the .travis.yml to show

node_js:
- 6
- 8
- 10

i.e. run the tests in node 6, 8 and 10. This PR will of course be part of the major version bump.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Thanks for the instruction. The first attempt was not successful. But when I added acorn to dependencies it passed those tests. Now I would try to see if we may add it to devDependencies and pass the tests.

@archmoj

Copy link
Copy Markdown
Author

@etpinard OK. Acorn could be located in dev-dependencies.

@etpinard

etpinard commented Nov 22, 2018

Copy link
Copy Markdown
Contributor

Thanks @archmoj !

Let's wait a couple days to see if other cwise maintainers have an opinion on this patch, and/or other things they would like to make part of cwise@2.0.0.

@archmoj

Copy link
Copy Markdown
Author

@etpinard Would you please merge this and possibly publish new version?

@etpinard

Copy link
Copy Markdown
Contributor

I'll wait until Wednesday at the latest. Last Thursday and Friday were holidays in the US.

@etpinard

Copy link
Copy Markdown
Contributor

@archmoj turns out I have write rights on Github, but I don't have publish rights on npm. So even if we merge this, we won't be able to publish the changes.

cc @rreusser and @mikolalysenko

@rreusser

rreusser commented Nov 29, 2018

Copy link
Copy Markdown
Member

Although the tests passes and the transform code itself works, it looks like this static-module does not function correctly, resulting in about an extra 120kb of esprima parser code in each bundle.

The problem appears to be present in version 3.0.0 of static-module (not sure about 2.*). It looks like maybe it doesn't deal well with bare module functions (e.g. require('cwise')(...)) as opposed to functions which are properties on the module (e.g. require('fs').readFileSync(...)). That's a bit of a guess/inference, but it does seem like there's a problem in this area.

Testing strategy:

First of all, remember to rm -rf node_modules and reinstall if you switch branches!

Within this repo, I created a file browserifytest/index.js:

// browserifytest/index.js:varcwise=require('cwise');varaddeq=cwise({args: ["array","array"],body: function(a,b){a+=b}})

I added a browserifytest/package.json with symlinked cwise:

// browserifytest/package.json:
{
"dependencies": {
"cwise": "../"
}
}

This way, cwise gets resolved to the cloned repo, as required in order to actually use static-module. (I had to mkdir -p browserifytest/node_modules and symlink ln -s browserifytest/node_modules/cwise ./ since npm install in this directory was being a little weird).

Finally, I created a script to browserify it:

// browserifytest/browserify.jsrequire('browserify')().add('./index.js').transform('../cwise.js').bundle().pipe(process.stdout);

Then you can run:

$ node browserify.js |grep "cwise/lib/wrapper"

If this line is present, it's been static-module-transformed correctly. The master branch correctly transforms the code and removes esprima, while the archmoj:upgrade-dep does not.

I wish I had a cleaner test case, but these things are just a bit awkward to test since require('./') is completely different from require('cwise') as far as static-module is concerned.

It'd be great to fix the security issue, but I think we probably need to figure out what's going on here first.

@etpinard

Copy link
Copy Markdown
Contributor

Thanks very much @rreusser for looking into this!

@adarob

Copy link
Copy Markdown

How about just upgrading to 2..?

@rreusser

Copy link
Copy Markdown
Member

@adarob Version 3.0 is current, but it was version 2.0 which broke compatibility. I'm sure a workaround can be constructed, but the behavior in question is pretty much at the center of what cwise does so that it doesn't seem trivial and would mean thinking carefully about what cwise is and how it works. I do try to keep the wheels turning here, but it's not currently something I have the ability to work on. See: browserify/static-module#48 (comment)

@Domino987

Copy link
Copy Markdown

Any news on this?

@mhnsn

Copy link
Copy Markdown

Seriously. We depend on plotly for a product, and can't afford arbitrary code execution vulnerabilities, since we're opening up our API.

@etpinard

Copy link
Copy Markdown
Contributor

@mhnsn some info on the topic that you might find relevant:

@cjwainwright

Copy link
Copy Markdown

@etpinard The “dist” packages do not include minified plotly code that can be included by script tag. Is there anything other than the full plotly.js package that does? Which would allow bypassing this vulnerability without adding a new build step.

@etpinard

Copy link
Copy Markdown
Contributor

The “dist” packages do not include minified plotly code that can be included by script tag.

You're right, we don't include the minified version, still the files in each of the "dist" packages are bundled up and effectively bypass the build step. We don't include minified bundles in the "dist" packages to keep the amount of bytes to download to a minimum.

s there anything other than the full plotly.js package that does?

If you want a minified file w/o having to minify it yourself, you can use our CDN bundles ending with min.js e.g. https://cdn.plot.ly/plotly-basic-latest.min.js

@cjwainwright

Copy link
Copy Markdown

@etpinard Thanks for explaining. Our use case is to have npm pull in third party libraries, and just copy the relevant files to our dist folder. For libraries like jQuery etc the minified file is present so we can just copy directly without any further processing. Using direct from the CDN is not feasible in our case.

I had already gone ahead and investigated if it was possible to add the minified files to the packages, I have a pull request (on my own fork) if you're interested in taking a look: cjwainwright/plotly.js#1 But I understand if this is a deliberate choice to exclude the minified files then we will have to find a different way.

@kibertoad

Copy link
Copy Markdown

@etpinard Is anything left before this can be merged?

@nicolaskruchten

Copy link
Copy Markdown

Hi folks,

Is there any path towards getting the security issue sorted out in this repo? If not, we will likely have to inline the entire dependency path to this module into the plotly.js tree to bypass it ourselves, and thus in effect do a fork of a bunch of stuff :(

@nicolaskruchten

Copy link
Copy Markdown

OK so @archmoj has submitted browserify/static-eval#31, which if merged would allow us to resolve browserify/static-module#48 such that this current issue can be resolved, such that https://www.npmjs.com/advisories/758 would no longer apply to Plotly.js, resolving plotly/plotly.js#4796 and clearing up plotly/plotly.py#2386 and plotly/plotly.py#2385 and https://github.com/plotly/jupyterlab-chart-editor/issues/47

@nicolaskruchten

Copy link
Copy Markdown

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

@archmoj

Copy link
Copy Markdown
Author

Update: we've resolved the downstream issues by having plotly.js no longer depend on cwise.

For more info: https://github.com/plotly/plotly.js/releases/tag/v1.54.4

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants

@archmoj@etpinard@rreusser@adarob@Domino987@mhnsn@cjwainwright@kibertoad@nicolaskruchten