G4Sphere::SurfaceNormal() returns the wrong normal for points on the end theta plane. The reason is a typo on line 671 of G4Sphere.cc: the Z component of the normal should be -sin(fSTheta+fDTheta) ^ and not -sin(fSTheta+fSTheta) (Easy to do since the S is right next to the D on the keyboard.)
Thanks for the report. We'll check that!
Fixed in tag "geom-solids-csg-V03-02-00". Will be included in next public patch or release.