iphone-dataprotection icon indicating copy to clipboard operation
iphone-dataprotection copied to clipboard

read_file() in backup4.py is reporting "Incorrect padding for file" because record.size is bogus.

Open GoogleCodeExporter opened this issue 10 years ago • 2 comments

What steps will reproduce the problem?
1. Restore "Library/Calendar/Calendar.sqlitedb" from HomeDomain in an encrypted 
backup.

What is the expected output? What do you see instead?

I see:

    WARNING: Incorrect padding for file Library/Calendar/Calendar.sqlitedb

And the restored file is correctly decrypted, but truncated. 

Expected output is a non-truncated file.

This also occurs with the Library/SMS/sms.db file.

The phone is running iOS 6.1.4.

What version of the product are you using? On what operating system?
OS X version :
XCode version :
Tools revision : e51ae39e7f5b+ tip

Please provide any additional information below.

The encrypted file is valid with a padding of 16.  The issue is that the code 
in backup4.py is relying on the "record.size" instead of just checking for 
PKCS5 padding.  It appears that record.size can be incorrect in some cases, 
probably an apple bug.

This recurs after wiping the backup directory and backing up again. (I did not 
reboot the phone.)

If I change the code just do standard PKCS5 padding removal, it works, and I 
get a valid file.  For testing, I used the following code:

diff -r e51ae39e7f5b python_scripts/backups/backup4.py
--- a/python_scripts/backups/backup4.py Sun May 26 13:13:10 2013 +0200
+++ b/python_scripts/backups/backup4.py Wed Aug 14 19:34:51 2013 -0700
@@ -160,7 +160,14 @@
             file_data = AESdecryptCBC(file_data, key)
             padding = file_data[record.size:]
             if len(padding) > 16 or padding != chr(len(padding)) * len(padding):
-                warn("Incorrect padding for file %s" % record.path)
+                warn("Incorrect padding for file %s %d %d" % (record.path, 
len(file_data),record.size))
+                c = file_data[-1]
+                i = ord(c)
+                if i < 17 and file_data.endswith(c*i):
+                  warn("But good padding of %d anyway" % i)
+                  file_data = file_data[:-i]
+
+                return file_data
             file_data = file_data[:record.size]
         return file_data

And got:

WARNING: Incorrect padding for file Library/Calendar/Calendar.sqlitedb 9441296 
9424896
WARNING: But good padding of 16 anyway
WARNING: Incorrect padding for file Library/SMS/sms.db 1019920 1015808
WARNING: But good padding of 16 anyway



Original issue reported on code.google.com by [email protected] on 15 Aug 2013 at 2:41

GoogleCodeExporter avatar Mar 19 '15 02:03 GoogleCodeExporter

This issue was updated by revision 4222556965e9.

Original comment by [email protected] on 18 Aug 2013 at 11:18

GoogleCodeExporter avatar Mar 19 '15 02:03 GoogleCodeExporter

Thanks a lot for the great report and patch, just pushed it to the repo.

Original comment by [email protected] on 18 Aug 2013 at 11:19

  • Changed state: Accepted

GoogleCodeExporter avatar Mar 19 '15 02:03 GoogleCodeExporter