Is there any way to free a semaphore from a priority 0 interrupt?

Can you not change the priority of this interrupt? See here for explanation - Understanding priority levels of ISR and FreeRTOS APIs - #16 by aggarg