Make WordPress Core

Opened 4 years ago

Last modified 10 months ago

#50510 new enhancement

Improve security of wp_nonce implementation

Reported by: chaoix's profile chaoix Owned by:
Milestone: Awaiting Review Priority: normal
Severity: normal Version:
Component: Security Keywords: dev-feedback
Focuses: Cc:


The current wp_nonce implementation is a little out dated and should be improved. While nonces aren't security, a strong nonce implementation can provide some security against form field manipulation.

I have attached a mu-plugin I wrote to test a new nonce algorithm. I will convert it to a patch if there is interest in improving this in core. I have been running this mu-plugin on several high traffic sites I manage with no issues for over 6 months now.

Attachments (3)

secure-wp-nonces.php (3.2 KB) - added by chaoix 4 years ago.
Secure WP Nonces mu-plugin
secure-wp-nonces.2.php (3.2 KB) - added by chaoix 3 years ago.
secure-wp-nonces.3.php (4.8 KB) - added by chaoix 3 years ago.

Download all attachments as: .zip

Change History (9)

4 years ago

Secure WP Nonces mu-plugin

#1 @johnbillion
4 years ago

  • Component changed from General to Security
  • Keywords reporter-feedback added

Thanks for the ticket @chaoix.

Can you provide some information about the algorithm and the changes you've made from core's current implementation please? What aspects make it more secure? Do you have any test coverage? etc.


#2 @knutsp
4 years ago

I have tested the attached plugin for a month on four sites. No issues observed, except that it reports undefined variable $value in line 40.

#3 @johnbillion
4 years ago

@chaoix Any update on the above? This is a mystery change without more information from you :-)

#4 @chaoix
3 years ago

I have provided an updated implementation of my changes to the nonce algorithm with more detailed comments.

The benefits of these changes are:

  • Uses the sha512/sha256 hashing algorithm for increased nonce length and performance improvements with longer nonce actions. Longer actions prevent brute forcing of the nonce for known action names. MD5 was the previous hashing algorithm used and is not secure enough for what nonces are being used for in WordPress.
  • Adds complexity to the nonce hash algorithm to make them more difficult to reverse engineer using rainbow tables.
  • Adds a browser id to the nonce action to help prevent known hash reuse.
  • Reject nonces from browsers with no or invalid user agent strings. This will prevent lazy bots from submitting requests.

I have had these changes running live on 4 higher traffic sites with no issues. I have not run or made any unit tests for these changes.

Last edited 3 years ago by chaoix (previous) (diff)

#5 @chaoix
3 years ago

  • Keywords dev-feedback added; reporter-feedback removed

#6 @kkmuffme
10 months ago

I think this is definitely something that could be added easily, however the PR needs a bit of work.

  • Why do you hash the user agent, when you then hash everything later on anyway?
  • the user agent might not be set if the request comes from PHP CLI, atm this produces a notice in the patch
  • redudant code line 26/27?
  • always use SHA512, since it's faster
  • why truncate to 64 characters?
  • hash_hmac seems useless as well as the explode making it unnecssarily complex/slow
  • duplicate code with the user agent in 2 functions
Note: See TracTickets for help on using tickets.