After further inspection, I no longer believe file attachment 1 (hudson.model.Run.patch) is an appropriate patch for this bug.
The bug appears to be caused by Build.RunnerImpl setting AbstractBuild.buildEnvironments = null after all the builders are finished. Because of this, none of the Publishers have access to all of the environment from AbstractBuild.getEnvironment().
Is it necessary to set buildEnvironments = null at all, and if it is, could this be done at the end of Build.RunnerImpl.cleanUp()?
Is it appropriate for Publishers to call AbstractBuild.getEnvironment()?
This patch may fix this problem, though I'm not quite sure. Uploading now in case this could help someone else sooner rather than later.