@@ -179,14 +179,19 @@ func (ssm *fileBasedSecureStorageManager) withCacheFile(lease *Lease, action fun
179179 logger .Warnf ("Unable to lease cache. %v" , err )
180180 return err
181181 }
182- cacheFile , err := os .OpenFile (ssm .credFilePath (), os .O_CREATE | os .O_RDWR , 0600 )
182+
183+ const cachefilePermissions = 0600
184+
185+ path := ssm .credFilePath ()
186+
187+ cacheFile , err := os .OpenFile (path , os .O_CREATE | os .O_RDWR , cachefilePermissions )
183188 if err != nil {
184- logger .Warnf ("cannot access %v. %v" , ssm . credFilePath () , err )
189+ logger .Warnf ("cannot access %v. %v" , path , err )
185190 return err
186191 }
187192 defer func (file * os.File ) {
188193 if err := file .Close (); err != nil {
189- logger .Warnf ("cannot release file descriptor for %v. %v" , ssm . credFilePath () , err )
194+ logger .Warnf ("cannot release file descriptor for %v. %v" , path , err )
190195 }
191196 }(cacheFile )
192197
@@ -208,7 +213,9 @@ func (ssm *fileBasedSecureStorageManager) withCacheFile(lease *Lease, action fun
208213 logger .Warnf ("failed to ensure owner for temporary cache file. %v" , err )
209214 return err
210215 }
211- if err := ensureFilePermissions (cacheFile , 0600 ); err != nil {
216+
217+ tryRemediateFilePermissions (cacheFile , cachefilePermissions )
218+ if err := ensureFilePermissions (cacheFile , cachefilePermissions ); err != nil {
212219 logger .Warnf ("failed to ensure permission for temporary cache file. %v" , err )
213220 return err
214221 }
@@ -306,6 +313,32 @@ func ensureFileOwner(f *os.File) error {
306313 return nil
307314}
308315
316+ // Users may manually create or save over the credential cache file leading to the presence of
317+ // a zombie cache file with no path to recovery. This gives a path to recovery.
318+ // If the file exists, try to secure its perms before opening
319+ func tryRemediateFilePermissions (f * os.File , expectedMode os.FileMode ) {
320+ info , err := f .Stat ()
321+ if err != nil {
322+ // With an open FD, ENOENT is unlikely; warn on real errors and return.
323+ if ! errors .Is (err , os .ErrNotExist ) {
324+ logger .Warnf ("could not stat %s: %v" , f .Name (), err )
325+ }
326+ return
327+ }
328+
329+ current := info .Mode ().Perm ()
330+ if current == expectedMode {
331+ // No-op: silently return
332+ return
333+ }
334+
335+ if chmodErr := f .Chmod (expectedMode ); chmodErr == nil {
336+ logger .Infof ("Set existing file %s to %04o permissions" , f .Name (), expectedMode )
337+ } else {
338+ logger .Warnf ("could not force %04o on existing file %s: %v" , expectedMode , f .Name (), chmodErr )
339+ }
340+ }
341+
309342func ensureFilePermissions (f * os.File , expectedMode os.FileMode ) error {
310343 fileInfo , err := f .Stat ()
311344 if err != nil {
0 commit comments