I'm reading about the security of the Signal protocol (used in WhatsApp) and in particular, the X3DH part used to establish authentication, all papers seem to gloss over Man in the Middle attacks. Is it possible or not to MitM between users and the server? Seems easy on the server.
This is "covered" by section 4.1 of the X3DH spec:
Before or after an X3DH key agreement, the parties may compare their identity public keys $IK_A$ and $IK_B$ through some authenticated channel. For example, they may compare public key fingerprints manually, or by scanning a QR code. Methods for doing this are outside the scope of this document.
Signal and WhatsApp both support verifying identities through QR codes, and provide a warning (optional in WhatsApp) if the other party's identity public key changes. That would stop MITM attacks, or make them detectable, though in practice almost no one does the verification.
Also note that the connection between the app and server is TLS-protected, so any MITM attack would need to be carried out by compromising the server itself.