I looked at how the zip and unzip steps are implemented.
The unzip step copies the file content as a stream and does not attempt to set the file modes, so this is clearly a missing feature there.
In contrast, the zip step calls ArchiverFactory.ZIP.create and then Archiver.visit, i.e. ZipArchiver.visit, which attempts to save the file mode:
If the zip step loses the permissions regardless, then the problem might be caused by JENKINS-53874, in which case it should be fixed in the Jenkins core. (The "version made by" and "external file attributes" fields described in APPNOTE.TXT - .ZIP File Format Specification are relevant. JENKINS-64818 is similar but not the cause here, because it applies to VirtualFile.zip rather than ZipArchiver.)