Yes. Due to how physics is simulated (and computational limits) if they’re moving fast enough, they may pass through each other. The conventional way to prevent this is to use ray-casts.
Because Raycasts occur at a different time than physics simulations, this checks if we “should have” hit something. If we would of, we pull the object back to the hit location and because the object is now touching the collisions, our OnHit() event will trigger.
Edit: I did this is 3D, but it will work in 2D as well.