Is there way to make an object gravitate or lock to the surface of another object?
As far as I know, there is no way to specify the force of gravity per object. However, in world settings, you can set the global gravity to 0, and then you can apply whatever forces are actually required (to simulate desired gravity effects) via python.

For example, if I wanted to attract physics-enabled objects to the faces of a cube, I could do it with the following script, running on that cube:

def apply(cont):
    cube = cont.owner
    for o in cube.scene.objects:
        normal = o.rayCast(cube, o)[2]
        if not normal: continue
        g = -normal * 9.8
        o.applyForce(g)


As you can see,  I iterate over all objects in the scene, and I cast a ray from the object to the cube, in order to get the normal vector of the intersected face, which, when negated, represents the direction of the desired force I wish to apply.

After that, it's just a matter of scaling that vector, and passing it to applyForce.

Here's a .blend that shows this script in action: custom_gravity.blend