The CSPRNG used in Linux is effectively the ChaCha stream cipher. Like all cryptographically secure PRNGs, it passes the next bit test, which says that given an arbitrary amount of output from the PRNG, an attacker cannot predict the next bit with a probability substantially greater than 0.5. This test covers all possible ways of guessing: statistical analysis of the stream, intensive analysis of the algorithm, or any other means.
ChaCha uses a permutation and combines the original input, which contains the key and nonce, with the result of the permutation to prevent inverting the operation. This approach is also used by SHA-2 and BLAKE2 (although with different inputs) to great success. We presently believe that an attacker cannot distinguish the output of ChaCha20 from random, and the best known attacks are on 7 of 20 rounds. Because the ChaCha output isn't invertible and there's no way to distinguish it from random, we don't believe there's any way to guess future outputs that's better than chance. (Technically, we believe the attacker could guess by brute force, but the 2^-256 advantage is considered to be negligible here.)
In addition, recent versions of the Linux CSPRNG also use fast key erasure. That means that once random bytes are generated, additional CSPRNG output is used to change the key used, so that if the kernel's internal state is leaked, previous outputs are not compromised.
If your question is about the seeding of the CSPRNG, that's essentially done by hashing inputs with the keyed hash function BLAKE2s to produce a key for ChaCha. These inputs are things like interrupt timings, which each contain a small amount of entropy, and when 256 bits of entropy are believed to have been collected, the key is generated and ChaCha is seeded. Because BLAKE2s in this case is believed to be a pseudorandom function, this is a secure way of distilling the entropy into a suitable key for ChaCha.
If you're interested in how ChaCha works, the Wikipedia article is actually quite good. The algorithm is really quite simple and could be implemented from memory, The code is relatively easy to follow and demonstrates the main idea. Note that even though it looks very simple, substantial cryptanalysis has gone into ensuring that it's secure, and producing an algorithm that is both secure and simple isn't easy.