Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Security Fix | https://github.com/bithavoc/express-winston/issues/266 #284

Open
wants to merge 6 commits into
base: main
Choose a base branch
from

Conversation

jnsppp
Copy link

@jnsppp jnsppp commented Jan 16, 2024

No description provided.

// Warning: this eats a ton of memory under heavy load.
return _.template(m, templateOptions)(data);
// ! Do not use the template engine in case `msg` is a function. Allowing this would enable code injection
return loggerOptions.msg(data.req, data.res);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

so it's a design flaw, that's the reason for the major version bump?

Copy link
Author

@jnsppp jnsppp Jan 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bithavoc no, but what if someone intentionally used the templating syntax in loggerOptions.msg? The template vars will not be resolved anymore, which is kinda breaking, especially if you have built alerting or monitoring process based on your logs.

However, in the end, I don't have a very strong opinion on the version - could also be a patch or minor, if you say so. Just let me know and I'll update the PR. The important part is that lodash template engine is not invoked so that it cannot be exploited.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it's a good justification for a major version bump, it's like giving folks too many ways to shoot themselves in the foot.

Can you add to the Readme an example of the migration path and an example user who might be affected by this change?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, will do. I will also check the other lines, where the templating is used. Quite sure, this here is a problem, too: https://github.com/bithavoc/express-winston/blob/main/index.js#L134

Copy link
Author

@jnsppp jnsppp Jan 16, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I think, that is actually the case. Where ever the templating engine is used with req.url this vulnerability is there.

Given this, I would propose to replace any occurrences of {{req.url}} with {{req.route.path}}. See https://expressjs.com/en/4x/api.html#req.originalUrl and https://expressjs.com/en/4x/api.html#req.route.

This justifies the major version bump even more. But it also takes more time to prepare the PR, since a lot of tests need to be adapted. I'll let you know, once I have an update for you

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jnsppp
Copy link
Author

jnsppp commented Jan 17, 2024

@bithavoc

I just pushed a commit that replaces the {{req.url}} with {{req.route.path}} all over the place, because {{req.url}} might open a Pandora's box, as explained in #266.

Therefore, no user provided input is logged anymore by default, but only the route itself. This is safe as it's a string and a client cannot exploit it. However, there's one edge case, where this might break, but I got it covered. Please see the following example:

// Middleware not associated with a specific route
app.use((req, res, next) => {
    // req.route will be undefined here
    try {
      console.log(req.route.path); // ! This would throw if not handled in the package
    } catch (error) {
      console.error('Error:', error.message);
    }
    next();
});

To prevent it from failing, I introduced a ternary in the template:

'{{req.method}} {{req.route?.path ? req.route.path : "invalid route"}}'

This is not only handling this, but also highlighting if express could not handle a specific route.

image

Additionally, I consolidated the regex that was used for the template engine. There were two, but I went for the more inclusive one, since there's no reason two use different ones.

The section in the Readme.md is still pending, will come back to this later. - Update: done ✅

@jnsppp
Copy link
Author

jnsppp commented Jan 19, 2024

Hey @bithavoc any update on this?

Sign up for free to 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.

2 participants