There are several benefits for enforcing signature on the CSR.
- Signing of the CSR provides strong proof that the public key that will end up in the certificate is a valid public key for which there exists a private key. This enforces key generation correctness for certificate requesting party. It also prevents the certificate requesting party from (at least trivially) including arbitrary value in the certificate's public key field (e.g., political statements, hate speech, etc.).
- The subject could include some errors in CSR and once the certificate is issued, claim that it was CA who introduced the errors in the certificate. The signature on the CSR will prove that the subject was the one who asked the data with errors to be included in the certificate.
Sure, the subject could then claim that the key which signed CSR is not his, but that would be something that is harder for the subject to repudiate, especially if he has already made some signatures with the key and he does not want to repudiate them.
- It is possible to come up with attacks against non-standard protocols, that would not be possible if the CSR was signed. For instance, if Mallory could obtain certificate in her name which contains Bob's public key, the Mallory could replace the Bob's certificate attached to Bob's signed message with her certificate and trick the relying party to believe that Mallory signed it. (Note: this will not work in EU eIDAS signature formats where the hash of signatory's certificate is included under the signature.) You could say that this does not provide any advantage to the Mallory, since Mallory could legally obtain certificate which contains her own key and simply resign Bob's messages. However, there may be non-standard protocols where this is not possible. For example, where the relying party expects the public key used to sign the message to have a specific value. This protocol would be secure if CSR is signed, but becomes insecure if the CSR is not signed.
See the reasoning provided in RFC 2986:
Note 2 - The signature on the certification request prevents an
entity from requesting a certificate with another party's public key.
Such an attack would give the entity the minor ability to pretend to
be the originator of any message signed by the other party. This
attack is significant only if the entity does not know the message
being signed and the signed part of the message does not identify the
signer. The entity would still not be able to decrypt messages
intended for the other party, of course.