This way is slow but safe and will work on any system that has a 'umask' shell command:
def current_umask() -> int:
  """Makes a best attempt to determine the current umask value of the calling process in a safe way.
  Unfortunately, os.umask() is not threadsafe and poses a security risk, since there is no way to read
  the current umask without temporarily setting it to a new value, then restoring it, which will affect
  permissions on files created by other threads in this process during the time the umask is changed.
  On recent linux kernels (>= 4.1), the current umask can be read from /proc/self/status.
  On older systems, the safest way is to spawn a shell and execute the 'umask' command. The shell will
  inherit the current process's umask, and will use the unsafe call, but it does so in a separate,
  single-threaded process, which makes it safe.
  Returns:
      int: The current process's umask value
  """
  mask: Optional[int] = None
  try:
    with open('/proc/self/status') as fd:
      for line in fd:
        if line.startswith('Umask:'):
          mask = int(line[6:].strip(), 8)
          break
  except FileNotFoundError:
    pass
  except ValueError:
    pass
  if mask is None:
    import subprocess
    mask = int(subprocess.check_output('umask', shell=True).decode('utf-8').strip(), 8)
  return mask