Here, the logic to determine access to different features of the application is dependent on a configuration file that comes shipped with the application bundle i.e. apk file.
We will see how to crack it and gain access to features that are hidden or forbidden to the user.
The initial screen that appears to the user when we start the application is shown below.
Now the user logs in to the application. This being a hybrid
application it makes a call to the web server and authenticates the user.
Once the login is successful the user is given access to the application. Note that the user – “Bob” is able to access to ONLY 2 features of the application viz. Funds transfer and View History.
However, Bob is aware that other uses of the same
application get access to more than 2 features after login. Well, they could be some
privileged users of the application. But, Bob is not happy with it. He somehow wants
access to all the features of the application and he decides to crack it.
He uses a tool called – “apktool”, which is a
reverse engineering tool for android and tries to unpack the “.apk” file. The
steps are really simple, go to the directory where you have “apktool” and type “apktook
d <name of the apk file to be unpacked> <name of directory to place
the contents>”
Once the command is executed it unpacks the application in
the specified directory – “Decompiled” in this case.
The unpacked directory is shown below, observe that it gives
access to the entire “res” (i.e. resource) directory of the application.
Bob is happy to see that and he continues to browses the contents
within the “res” directory. To his surprise he observes that there is a file
named – “accessdata.xml” that has something like names of different menus and their
status as “ON” or “OFF”. He has found a treasure here :) This could probably be the access control
configuration.
He observes that the menus to which he has access are marked
as “ON” and the other menu is kept as “OFF”. He changes the 3rd menu
to ON and saves the file.
He recompiles the file using the same apktool, as below.
This time he uses the mode “b” of the apktool.
Bob now has a recompiled application with a new access control configuration. But can he install this “apk” file in this device?
No,
with the process of recompilation he has lost of developer signature. He
wonders how to resolve this issue until he figures out a tool called “SignApk”.
He signs the application
with “SignApk” using the following command. It is pretty straightforward; all
you need to do it use the command below and specify a new name for the apk
file, “MyBankSigned.apk” as in this case.
The signed apk is shown below.
Bob firsts uninstalls the application that he already has.
And excitedly installs his new apk into the device using “adb”.
Now, Bob logins into the application.
Bingo!!! He gets access to the 3rd Menu, which is
not authorized to access.
Bob can now proceed to create new account in the system.
Why did Bob succeed?
This is because the application had insecure
access control logic. It relied on some configuration files and took access
control decision based on it.
Observe that the “MenuDisplay” activity that loads after
successful login loads the configuration from the raw file.
The configurations i.e. “item and value” pairs are picked
from the xml file (accessdata.xml) and stored it in a “menuconfig” object.
Depending on the value obtained from the configuration file the menus are
either made visible or disabled for the user.
This leaves a big hole in the application that the users can
easily change the values of the configuration file which is in clear text and
alter the functionality of the application.
Thus, applications that make use of clear text values from
configurations files, database, and preference files are all subject to such
attacks.
So what is the solution
for this problem?
Create different “apk” files for different user types/roles
and distribute it to the users. Every user who belongs to a particular user
type will then get a specific apk file that has no logic to make any access control decision. And then there will be no scope for the user can
to manipulate any value stored in any file to influence the functionality of
the application.
If the above solution is NOT feasible following technique
can be used.
For Online Access -
(This applicable for application that can make a
call to the web server.)
A) Instead of fetching the access rights information
locally, fetch it from the remote server and load the menu controls based on
the server response.
B) To maintain data integrity, create a checksum of the
access right information at server and send it along with response.
C) Validate the checksum at the client end before loading
the menu controls
For Offline Access –
(This applicable for application that does not make call to
the web server.)
A) Store the access rights information in an encrypted
format in the database/files.
B) To maintain data integrity, create a checksum of the
access right information and save it separately in the file.
C) Validate the checksum before loading the menu controls
based on the flags.