This in the realm of Dan Luu's fsyncgate: https://danluu.com/fsyncgate/ (discussed here: https://news.ycombinator.com/item?id=19126824 ) and "Crash Consistency" https://danluu.com/file-consistency/
The article is about "circling back" and re-checking data blocks against checksums seperately stored rather than relying on hardware checksums and data blocks that match but are "old" (not updated when expected).
The "why" of how such things happen is long and turgid exposition into sometimes shit happens .. and that's a book or three by itself.
Another scenario (OS, driver bugs) is that a correct block is written to a wrong location. Yes the write is persisted, but overwriting a wrong location. So now you have two incorrect blocks.