There is a side channel attack which allows recovery of private key with as little as 200 signatures but that requires access to the physical machine. Not sure if it could be implemented on a VPS running on hardware the attacker has access to.
Flawed PRNG is one another possible risk, attacker could attempt to flood you with requests to reduce the entropy pool. A proper PRNG should block until the entropy pool recovers but if someone took a shortcut you could be signing with reduced entropy which in theory would make the signatures weaker. Weak enough to brute force? Not sure but I would use RFC6979 to create deterministic singatures and thus remove the need for PRNG all together.
Lastly this isn't an attack issue but possibly an implementation one. If the number of signatures is relatively large (say you have 1000 private keys) and lots of users request it you in theory could be talking about a significant computing overhead on the server. Unless you absolutely need real time proofs I would batch user requests by having user provide a seed/nonce. Concatenate all user request nonces and add that to the end of the message to be signed. You probably don't need to have users provide nonces as a message without user provided nonce would prove the same information. User provided nonces don't really add any security. The message only proves you have control of the private keys. The actual verification of the amount those keys control requires auditing the blockchain.
However in either case the message you sign should never be just a nonce or hash as you subject yourself to an impersonation attack. It should be something explicit and absolutely useless to a third party trying to impersonate you.
Example:
The results of the cryptographic audit #00000001 for XYZ Inc, as of 05/07/2014 21:37 UTC. XYZ Inc, currently is holding 999.12345678 BTC of user funds, secured by 38 public keys. Signatures of this message for all 38 public key are provided with this message. The following are nonces requested by users since the last audit 0xEBAAEDCE6AF48A03BBFD25E8CD0364141 0xBBFD25E8CD0364141FEBAAEDCE6AF48A03 ... etc
To verify users can confirm their nonce is in the list of nonces for the batch (not really necessary), that the signatures of the message for all keys are valid and that the balance of those keys matches the expected amount. By signing at a set interval rather in real time the number of signing will not increase exponentially with the number of users.
In summary
a) Don't use VPS for hot wallets (you shouldn't anyways)
b) Use RFC6979 to reduce your dependency on proper PRNG function
c) Batch user requests (once signing per hour/day/etc) to reduce load on server.
Lastly there is no risk of message signatures being substituted for transactions. The Bitcoin message signing system takes the actual message and prepends "Bitcoin Signed Message:\n" to it. So even if a user provided you an actual transaction to sign what actually is signed becomes "Bitcoin Signed Message:\n