Mitady vulnerabilities amin'ny UC Browser

Mitady vulnerabilities amin'ny UC Browser

fampidirana

Amin'ny faran'ny volana martsa isika nitatitra, fa nahita fahafahana miafina izy ireo hampiditra sy hampandeha kaody tsy voamarina ao amin'ny UC Browser. Androany dia hojerentsika amin'ny antsipiriany ny fomba nitrangan'ity fampidinana ity sy ny fomba ahafahan'ny hackers mampiasa izany ho an'ny tanjony manokana.

Fotoana vitsy lasa izay, ny UC Browser dia navoaka sy nozaraina tamin'ny fomba mahery vaika: napetraka amin'ny fitaovan'ny mpampiasa mampiasa malware, nozaraina avy amin'ny tranokala isan-karazany amin'ny endrika rakitra video (izany hoe, nihevitra ny mpampiasa fa misintona, ohatra, horonan-tsary vetaveta, saingy fa nahazo APK tamin'ity navigateur ity), nampiasa sora-baventy mampatahotra misy hafatra fa efa lany andro ny navigateur, vulnerable, ary ny toy izany. Ao amin'ny vondrona UC Browser ofisialin'ny VK dia misy foto-kevitra, izay ahafahan'ny mpampiasa mitaraina momba ny dokam-barotra tsy ara-drariny, misy ohatra maro ao. Tamin'ny 2016 dia nisy ihany koa dokam-barotra video amin'ny teny Rosiana (eny, dokam-barotra ho an'ny navigateur fanakanana doka).

Tamin'ny fotoana nanoratana, ny UC Browser dia manana fametrahana mihoatra ny 500 ao amin'ny Google Play. Mahavariana izany - Google Chrome ihany no manana bebe kokoa. Anisan'ireo tsikera ianao dia afaka mahita fitarainana be dia be momba ny dokam-barotra sy ny famerenana amin'ny fampiharana sasany ao amin'ny Google Play. Izany no anton'ny fikarohanay: nanapa-kevitra izahay hijery raha nanao zavatra ratsy ny UC Browser. Ary hita fa manao izany izy!

Ao amin'ny kaody fampiharana dia hita ny fahafahana misintona sy mampandeha ny code executable, izay mifanohitra amin'ny fitsipika momba ny famoahana ny fangatahana amin'ny Google Play. Ho fanampin'ny hoe ny UC Browser dia misintona code executable, manao izany amin'ny fomba tsy azo antoka, izay azo ampiasaina amin'ny fanafihana MitM. Andeha hojerentsika raha afaka manao fanafihana toy izany isika.

Ny zavatra rehetra voasoratra etsy ambany dia mifandraika amin'ny kinova UC Browser izay hita tao amin'ny Google Play tamin'ny fotoana nanaovana ny fianarana:

package: com.UCMobile.intl
versionName: 12.10.8.1172
versionCode: 10598
sha1 APK-файла: f5edb2243413c777172f6362876041eb0c3a928c

Vector fanafihana

Ao amin'ny fanehoana UC Browser dia afaka mahita serivisy manana anarana manazava ny tenany ianao com.uc.deployment.UpgradeDeployService.

    <service android_exported="false" android_name="com.uc.deployment.UpgradeDeployService" android_process=":deploy" />

Rehefa manomboka ity serivisy ity dia manao fangatahana POST ny navigateur puds.ucweb.com/upgrade/index.xhtml, izay hita amin'ny fifamoivoizana fotoana fohy aorian'ny fanombohana. Ho setrin'izany dia mety hahazo baiko izy mba hisintona fanavaozana na module vaovao. Nandritra ny famakafakana dia tsy nanome baiko toy izany ny mpizara, saingy tsikaritray fa rehefa manandrana manokatra PDF amin'ny navigateur izahay dia manao fangatahana faharoa amin'ny adiresy voalaza etsy ambony, ary avy eo dia misintona ny tranomboky teratany. Mba hanatanterahana ny fanafihana dia nanapa-kevitra izahay fa hampiasa ity endri-javatra ity amin'ny UC Browser: ny fahafahana manokatra PDF amin'ny fampiasana tranomboky teratany, izay tsy ao amin'ny APK ary alainy amin'ny Internet raha ilaina. Tsara ny manamarika fa, ara-teorika, ny UC Browser dia azo terena hisintona zavatra tsy misy fifandraisana amin'ny mpampiasa - raha manome valiny voalamina tsara amin'ny fangatahana izay tanterahina aorian'ny fandefasana ny navigateur. Fa mba hanaovana izany, dia mila mianatra ny protocole amin'ny fifandraisana amin'ny mpizara amin'ny antsipiriany kokoa, noho izany dia nanapa-kevitra izahay fa ho mora kokoa ny hanova ny intercepted valiny ary hanolo ny tranomboky hiasa amin'ny PDF.

Noho izany, rehefa te hanokatra PDF mivantana amin'ny navigateur ny mpampiasa iray, dia azo jerena amin'ny fifamoivoizana ireto fangatahana manaraka ireto:

Mitady vulnerabilities amin'ny UC Browser

Voalohany dia misy fangatahana POST mba puds.ucweb.com/upgrade/index.xhtml, avy eo
Misy arsiva misy tranomboky hijerena ireo endrika PDF sy birao no alaina. Lojika ny fiheverana fa ny fangatahana voalohany dia mampita vaovao momba ny rafitra (farafaharatsiny ny maritrano mba hanomezana ny tranomboky ilaina), ary ho setrin'izany dia mahazo fampahalalana sasantsasany momba ny tranomboky mila alaina ny navigateur: ny adiresy ary, mety ho , zavatra hafa. Ny olana dia ity fangatahana ity dia misy encryption.

Mangataka sombiny

Sombiny valiny

Mitady vulnerabilities amin'ny UC Browser

Mitady vulnerabilities amin'ny UC Browser

Ny tranomboky mihitsy dia fonosina amin'ny ZIP ary tsy misy encryption.

Mitady vulnerabilities amin'ny UC Browser

Mitadiava kaody decryption fifamoivoizana

Andeha hojerentsika ny valin'ny mpizara. Andeha hojerentsika ny kaody kilasy com.uc.deployment.UpgradeDeployService: avy amin'ny fomba onStartCommand mandeha com.uc.deployment.bx, ary hatramin'ny com.uc.browser.core.dcfe:

    public final void e(l arg9) {
int v4_5;
String v3_1;
byte[] v3;
byte[] v1 = null;
if(arg9 == null) {
v3 = v1;
}
else {
v3_1 = arg9.iGX.ipR;
StringBuilder v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]product:");
v4.append(arg9.iGX.ipR);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]version:");
v4.append(arg9.iGX.iEn);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]upgrade_type:");
v4.append(arg9.iGX.mMode);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]force_flag:");
v4.append(arg9.iGX.iEo);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_mode:");
v4.append(arg9.iGX.iDQ);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_type:");
v4.append(arg9.iGX.iEr);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_state:");
v4.append(arg9.iGX.iEp);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]silent_file:");
v4.append(arg9.iGX.iEq);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apk_md5:");
v4.append(arg9.iGX.iEl);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_type:");
v4.append(arg9.mDownloadType);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_group:");
v4.append(arg9.mDownloadGroup);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]download_path:");
v4.append(arg9.iGH);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_child_version:");
v4.append(arg9.iGX.iEx);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_series:");
v4.append(arg9.iGX.iEw);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_arch:");
v4.append(arg9.iGX.iEt);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp3:");
v4.append(arg9.iGX.iEv);
v4 = new StringBuilder("[");
v4.append(v3_1);
v4.append("]apollo_cpu_vfp:");
v4.append(arg9.iGX.iEu);
ArrayList v3_2 = arg9.iGX.iEz;
if(v3_2 != null && v3_2.size() != 0) {
Iterator v3_3 = v3_2.iterator();
while(v3_3.hasNext()) {
Object v4_1 = v3_3.next();
StringBuilder v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_name:");
v5.append(((au)v4_1).getName());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_name:");
v5.append(((au)v4_1).aDA());
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_ver_code:");
v5.append(((au)v4_1).gBl);
v5 = new StringBuilder("[");
v5.append(((au)v4_1).getName());
v5.append("]component_req_type:");
v5.append(((au)v4_1).gBq);
}
}
j v3_4 = new j();
m.b(v3_4);
h v4_2 = new h();
m.b(v4_2);
ay v5_1 = new ay();
v3_4.hS("");
v3_4.setImsi("");
v3_4.hV("");
v5_1.bPQ = v3_4;
v5_1.bPP = v4_2;
v5_1.yr(arg9.iGX.ipR);
v5_1.gBF = arg9.iGX.mMode;
v5_1.gBI = arg9.iGX.iEz;
v3_2 = v5_1.gAr;
c.aBh();
v3_2.add(g.fs("os_ver", c.getRomInfo()));
v3_2.add(g.fs("processor_arch", com.uc.b.a.a.c.getCpuArch()));
v3_2.add(g.fs("cpu_arch", com.uc.b.a.a.c.Pb()));
String v4_3 = com.uc.b.a.a.c.Pd();
v3_2.add(g.fs("cpu_vfp", v4_3));
v3_2.add(g.fs("net_type", String.valueOf(com.uc.base.system.a.Jo())));
v3_2.add(g.fs("fromhost", arg9.iGX.iEm));
v3_2.add(g.fs("plugin_ver", arg9.iGX.iEn));
v3_2.add(g.fs("target_lang", arg9.iGX.iEs));
v3_2.add(g.fs("vitamio_cpu_arch", arg9.iGX.iEt));
v3_2.add(g.fs("vitamio_vfp", arg9.iGX.iEu));
v3_2.add(g.fs("vitamio_vfp3", arg9.iGX.iEv));
v3_2.add(g.fs("plugin_child_ver", arg9.iGX.iEx));
v3_2.add(g.fs("ver_series", arg9.iGX.iEw));
v3_2.add(g.fs("child_ver", r.aVw()));
v3_2.add(g.fs("cur_ver_md5", arg9.iGX.iEl));
v3_2.add(g.fs("cur_ver_signature", SystemHelper.getUCMSignature()));
v3_2.add(g.fs("upgrade_log", i.bjt()));
v3_2.add(g.fs("silent_install", String.valueOf(arg9.iGX.iDQ)));
v3_2.add(g.fs("silent_state", String.valueOf(arg9.iGX.iEp)));
v3_2.add(g.fs("silent_file", arg9.iGX.iEq));
v3_2.add(g.fs("silent_type", String.valueOf(arg9.iGX.iEr)));
v3_2.add(g.fs("cpu_archit", com.uc.b.a.a.c.Pc()));
v3_2.add(g.fs("cpu_set", SystemHelper.getCpuInstruction()));
boolean v4_4 = v4_3 == null || !v4_3.contains("neon") ? false : true;
v3_2.add(g.fs("neon", String.valueOf(v4_4)));
v3_2.add(g.fs("cpu_cores", String.valueOf(com.uc.b.a.a.c.Jl())));
v3_2.add(g.fs("ram_1", String.valueOf(com.uc.b.a.a.h.Po())));
v3_2.add(g.fs("totalram", String.valueOf(com.uc.b.a.a.h.OL())));
c.aBh();
v3_2.add(g.fs("rom_1", c.getRomInfo()));
v4_5 = e.getScreenWidth();
int v6 = e.getScreenHeight();
StringBuilder v7 = new StringBuilder();
v7.append(v4_5);
v7.append("*");
v7.append(v6);
v3_2.add(g.fs("ss", v7.toString()));
v3_2.add(g.fs("api_level", String.valueOf(Build$VERSION.SDK_INT)));
v3_2.add(g.fs("uc_apk_list", SystemHelper.getUCMobileApks()));
Iterator v4_6 = arg9.iGX.iEA.entrySet().iterator();
while(v4_6.hasNext()) {
Object v6_1 = v4_6.next();
v3_2.add(g.fs(((Map$Entry)v6_1).getKey(), ((Map$Entry)v6_1).getValue()));
}
v3 = v5_1.toByteArray();
}
if(v3 == null) {
this.iGY.iGI.a(arg9, "up_encode", "yes", "fail");
return;
}
v4_5 = this.iGY.iGw ? 0x1F : 0;
if(v3 == null) {
}
else {
v3 = g.i(v4_5, v3);
if(v3 == null) {
}
else {
v1 = new byte[v3.length + 16];
byte[] v6_2 = new byte[16];
Arrays.fill(v6_2, 0);
v6_2[0] = 0x5F;
v6_2[1] = 0;
v6_2[2] = ((byte)v4_5);
v6_2[3] = -50;
System.arraycopy(v6_2, 0, v1, 0, 16);
System.arraycopy(v3, 0, v1, 16, v3.length);
}
}
if(v1 == null) {
this.iGY.iGI.a(arg9, "up_encrypt", "yes", "fail");
return;
}
if(TextUtils.isEmpty(this.iGY.mUpgradeUrl)) {
this.iGY.iGI.a(arg9, "up_url", "yes", "fail");
return;
}
StringBuilder v0 = new StringBuilder("[");
v0.append(arg9.iGX.ipR);
v0.append("]url:");
v0.append(this.iGY.mUpgradeUrl);
com.uc.browser.core.d.c.i v0_1 = this.iGY.iGI;
v3_1 = this.iGY.mUpgradeUrl;
com.uc.base.net.e v0_2 = new com.uc.base.net.e(new com.uc.browser.core.d.c.i$a(v0_1, arg9));
v3_1 = v3_1.contains("?") ? v3_1 + "&dataver=pb" : v3_1 + "?dataver=pb";
n v3_5 = v0_2.uc(v3_1);
m.b(v3_5, false);
v3_5.setMethod("POST");
v3_5.setBodyProvider(v1);
v0_2.b(v3_5);
this.iGY.iGI.a(arg9, "up_null", "yes", "success");
this.iGY.iGI.b(arg9);
}

Hitantsika eto ny fananganana fangatahana POST. Mandinika ny famoronana andiana 16 bytes sy ny famenoana azy: 0x5F, 0, 0x1F, -50 (=0xCE). Mifanojo amin'izay hitantsika tamin'ny fangatahana etsy ambony.

Ao amin'io kilasy io ihany ianao dia afaka mahita kilasy misy nested izay manana fomba mahaliana hafa:

        public final void a(l arg10, byte[] arg11) {
f v0 = this.iGQ;
StringBuilder v1 = new StringBuilder("[");
v1.append(arg10.iGX.ipR);
v1.append("]:UpgradeSuccess");
byte[] v1_1 = null;
if(arg11 == null) {
}
else if(arg11.length < 16) {
}
else {
if(arg11[0] != 0x60 && arg11[3] != 0xFFFFFFD0) {
goto label_57;
}
int v3 = 1;
int v5 = arg11[1] == 1 ? 1 : 0;
if(arg11[2] != 1 && arg11[2] != 11) {
if(arg11[2] == 0x1F) {
}
else {
v3 = 0;
}
}
byte[] v7 = new byte[arg11.length - 16];
System.arraycopy(arg11, 16, v7, 0, v7.length);
if(v3 != 0) {
v7 = g.j(arg11[2], v7);
}
if(v7 == null) {
goto label_57;
}
if(v5 != 0) {
v1_1 = g.P(v7);
goto label_57;
}
v1_1 = v7;
}
label_57:
if(v1_1 == null) {
v0.iGY.iGI.a(arg10, "up_decrypt", "yes", "fail");
return;
}
q v11 = g.b(arg10, v1_1);
if(v11 == null) {
v0.iGY.iGI.a(arg10, "up_decode", "yes", "fail");
return;
}
if(v0.iGY.iGt) {
v0.d(arg10);
}
if(v0.iGY.iGo != null) {
v0.iGY.iGo.a(0, ((o)v11));
}
if(v0.iGY.iGs) {
v0.iGY.a(((o)v11));
v0.iGY.iGI.a(v11, "up_silent", "yes", "success");
v0.iGY.iGI.a(v11);
return;
}
v0.iGY.iGI.a(v11, "up_silent", "no", "success");
}
}

Ny fomba dia maka andian-byte ho fampidirana ary manamarina fa 0x60 ny byte aotra na 0xD0 ny byte fahatelo, ary ny byte faharoa dia 1, 11 na 0x1F. Mijery ny valin'ny mpizara izahay: ny zero byte dia 0x60, ny faharoa dia 0x1F, ny fahatelo dia 0x60. Toa izay ilaintsika. Raha tsaraina amin'ny andalana ("up_decrypt", ohatra), dia tokony hiantsoana fomba iray izay hamadika ny valintenin'ny mpizara.
Andeha isika hiroso amin'ny fomba gj. Mariho fa ny hevitra voalohany dia ny byte amin'ny offset 2 (izany hoe 0x1F amin'ny tranga misy antsika), ary ny faharoa dia ny valin'ny mpizara tsy misy.
16 bita voalohany.

     public static byte[] j(int arg1, byte[] arg2) {
if(arg1 == 1) {
arg2 = c.c(arg2, c.adu);
}
else if(arg1 == 11) {
arg2 = m.aF(arg2);
}
else if(arg1 != 0x1F) {
}
else {
arg2 = EncryptHelper.decrypt(arg2);
}
return arg2;
}

Mazava ho azy fa eto isika dia misafidy algorithm decryption, ary ny byte mitovy amin'ny antsika
tranga mitovy amin'ny 0x1F, manondro iray amin'ireo safidy telo azo atao.

Manohy mamakafaka ny kaody izahay. Rehefa avy nitsambikina roa isika dia mahita ny tenantsika amin'ny fomba iray misy anarana manazava ny tenantsika decryptBytesByKey.

Eto dia misy bita roa hafa misaraka amin'ny valintenintsika, ary misy tady azo avy amin'izy ireo. Mazava fa amin'izany fomba izany dia voafantina ny lakile decrypting ny hafatra.

    private static byte[] decryptBytesByKey(byte[] bytes) {
byte[] v0 = null;
if(bytes != null) {
try {
if(bytes.length < EncryptHelper.PREFIX_BYTES_SIZE) {
}
else if(bytes.length == EncryptHelper.PREFIX_BYTES_SIZE) {
return v0;
}
else {
byte[] prefix = new byte[EncryptHelper.PREFIX_BYTES_SIZE];  // 2 байта
System.arraycopy(bytes, 0, prefix, 0, prefix.length);
String keyId = c.ayR().d(ByteBuffer.wrap(prefix).getShort()); // Выбор ключа
if(keyId == null) {
return v0;
}
else {
a v2 = EncryptHelper.ayL();
if(v2 == null) {
return v0;
}
else {
byte[] enrypted = new byte[bytes.length - EncryptHelper.PREFIX_BYTES_SIZE];
System.arraycopy(bytes, EncryptHelper.PREFIX_BYTES_SIZE, enrypted, 0, enrypted.length);
return v2.l(keyId, enrypted);
}
}
}
}
catch(SecException v7_1) {
EncryptHelper.handleDecryptException(((Throwable)v7_1), v7_1.getErrorCode());
return v0;
}
catch(Throwable v7) {
EncryptHelper.handleDecryptException(v7, 2);
return v0;
}
}
return v0;
}

Raha mijery ny ho avy isika dia manamarika fa amin'izao dingana izao dia tsy mbola mahazo fanalahidy isika, fa ny "identifier" ihany. Ny fahazoana ny fanalahidy dia somary sarotra kokoa.

Amin'ny fomba manaraka dia ampiana masontsivana roa hafa ny efa misy, ka mahatonga ny efatra amin'izy ireo: ny laharana majika 16, ny famantarana manan-danja, ny angon-drakitra voatahiry ary ny tady tsy takatry ny saina (raha ny antsika, tsy misy).

    public final byte[] l(String keyId, byte[] encrypted) throws SecException {
return this.ayJ().staticBinarySafeDecryptNoB64(16, keyId, encrypted, "");
}

Aorian'ny fifandimbiasana maromaro dia tonga amin'ny fomba staticBinarySafeDecryptNoB64 interface tsara com.alibaba.wireless.security.open.staticdataencrypt.IStaticDataEncryptComponent. Tsy misy kilasy ao amin'ny kaody fampiharana lehibe izay mampihatra an'io interface io. Misy kilasy toy izany ao amin'ny rakitra lib/armeabi-v7a/libsgmain.so, izay tsy hoe .so, fa .jar. Ny fomba mahaliana antsika dia ampiharina toy izao manaraka izao:

package com.alibaba.wireless.security.a.i;
// ...
public class a implements IStaticDataEncryptComponent {
private ISecurityGuardPlugin a;
// ...
private byte[] a(int mode, int magicInt, int xzInt, String keyId, byte[] encrypted, String magicString) {
return this.a.getRouter().doCommand(10601, new Object[]{Integer.valueOf(mode), Integer.valueOf(magicInt), Integer.valueOf(xzInt), keyId, encrypted, magicString});
}
// ...
private byte[] b(int magicInt, String keyId, byte[] encrypted, String magicString) {
return this.a(2, magicInt, 0, keyId, encrypted, magicString);
}
// ...
public byte[] staticBinarySafeDecryptNoB64(int magicInt, String keyId, byte[] encrypted, String magicString) throws SecException {
if(keyId != null && keyId.length() > 0 && magicInt >= 0 && magicInt < 19 && encrypted != null && encrypted.length > 0) {
return this.b(magicInt, keyId, encrypted, magicString);
}
throw new SecException("", 301);
}
//...
}

Eto ny lisitry ny masontsivana dia ampitomboina amin'ny isa roa hafa: 2 sy 0. Raha tsaraina
ny zava-drehetra, 2 dia midika decryption, toy ny amin'ny fomba doFinal kilasy rafitra javax.crypto.Cipher. Ary izany rehetra izany dia nafindra tany amin'ny router iray amin'ny isa 10601 - izany dia toa ny laharana baiko.

Aorian'ny fifandimbiasana manaraka dia mahita kilasy iray izay mampihatra ny interface IRouterComponent ary fomba doCommand:

package com.alibaba.wireless.security.mainplugin;
import com.alibaba.wireless.security.framework.IRouterComponent;
import com.taobao.wireless.security.adapter.JNICLibrary;
public class a implements IRouterComponent {
public a() {
super();
}
public Object doCommand(int arg2, Object[] arg3) {
return JNICLibrary.doCommandNative(arg2, arg3);
}
}

Ary koa ny kilasy JNICLlibrary, izay anambarana ny fomba amam-panao doCommandNative:

package com.taobao.wireless.security.adapter;
public class JNICLibrary {
public static native Object doCommandNative(int arg0, Object[] arg1);
}

Midika izany fa mila mitady fomba ao amin'ny kaody teratany isika doCommandNative. Ary eto no manomboka ny fahafinaretana.

Famaritana ny code machine

Ao anaty rakitra libsgmain.so (izay .jar raha ny marina ary nahitanay ny fampiharana ireo interface mifandray amin'ny encryption etsy ambony) dia misy tranomboky teratany iray: libsgmainso-6.4.36.so. Sokafy amin'ny IDA izahay ary mahazo boaty fifanakalozan-dresaka misy hadisoana. Ny olana dia tsy mety ny tabilao lohatenin'ny fizarana. Izany dia natao mba hanasarotra ny fanadihadiana.

Mitady vulnerabilities amin'ny UC Browser

Saingy tsy ilaina izany: mba hamenoana tsara ny rakitra ELF ary hamakafaka azy, dia ampy ny latabatra lohatenin'ny programa. Noho izany, mamafa fotsiny ny latabatra fizarana isika, manaisotra ny saha mifanitsy amin'ny lohapejy.

Mitady vulnerabilities amin'ny UC Browser

Sokafy indray ny rakitra ao amin'ny IDA.

Misy fomba roa hilazana amin'ny milina virtoaly Java hoe aiza marina ao amin'ny tranomboky teratany no misy ny fampiharana fomba iray nambara tamin'ny code Java ho teratany. Ny voalohany dia ny manome azy anarana karazana Java_package_name_ClassName_MethodName.

Ny faharoa dia ny fisoratana anarana rehefa mameno ny tranomboky (ao amin'ny function JNI_OnLoad)
mampiasa antso fampiasa RegisterNatives.

Amin'ny tranga misy antsika, raha mampiasa ny fomba voalohany isika dia tokony ho toy izao ny anarana: Java_com_taobao_wireless_security_adapter_JNICLlibrary_doCommandNative.

Tsy misy asa toy izany eo amin'ireo asa aondrana, izay midika fa mila mitady antso ianao RegisterNatives.
Andao ho any amin'ny asa JNI_OnLoad ary hitantsika ity sary ity:

Mitady vulnerabilities amin'ny UC Browser

Inona no mitranga eto? Raha vao jerena, ny fanombohana sy ny fiafaran'ny fiasa dia mahazatra amin'ny maritrano ARM. Ny torolalana voalohany amin'ny stack dia mitahiry ny votoatin'ny rejisitra izay hampiasain'ny asa amin'ny asany (amin'ity tranga ity, R0, R1 ary R2), ary koa ny votoatin'ny rejisitra LR, izay misy ny adiresy miverina avy amin'ny asa. . Ny torolàlana farany dia mamerina ny rejisitra voatahiry, ary ny adiresy fiverenana dia apetraka avy hatrany ao amin'ny rejisitra PC - ka miverina amin'ny asa. Fa raha mijery akaiky ianao dia ho hitanao fa ny toromarika penultimate dia manova ny adiresy miverina voatahiry ao amin'ny stack. Andeha hatao kajy hoe hanao ahoana izany aorian’izay
famonoana kaody. Adiresy iray 1xB0 dia ampidirina ao amin'ny R130, esorina ny 5, avy eo afindra any amin'ny R0 ary ampiana 0x10. 0xB13B izany. Noho izany, mihevitra ny IDA fa ny fampianarana farany dia fiverenana ara-dalàna, fa raha ny marina dia mandeha any amin'ny adiresy kajy 0xB13B.

Tsara ny mampahatsiahy eto fa ny processeur ARM dia manana fomba roa sy torolalana roa: ARM sy Thumb. Ny bitika kely indrindra amin'ny adiresy dia milaza amin'ny processeur hoe inona no apetraky ny fampianarana ampiasaina. Izany hoe, ny adiresy dia 0xB13A raha ny marina, ary ny iray amin'ny kely indrindra dia manondro ny fomba Thumb.

"Adapter" mitovy amin'izany dia nampiana ny fiandohan'ny fiasa tsirairay ao amin'ity tranomboky ity sy
kaody fako. Tsy hiresaka momba azy ireo amin'ny antsipiriany bebe kokoa isika - tadidinay fotsiny
fa ny tena fiandohan'ny asa rehetra dia lavitra kely.

Satria tsy mitsambikina mivantana amin'ny 0xB13A ny kaody, dia tsy fantatry ny IDA mihitsy fa teo amin'io toerana io no nisy ilay kaody. Noho io antony io ihany, tsy fantany ny ankamaroan'ny kaody ao amin'ny tranomboky ho kaody, izay mahatonga ny famakafakana ho sarotra. Lazainay amin'ny IDA fa ity no code, ary izao no mitranga:

Mitady vulnerabilities amin'ny UC Browser

Ny latabatra dia manomboka mazava tsara amin'ny 0xB144. Inona no ao amin'ny sub_494C?

Mitady vulnerabilities amin'ny UC Browser

Rehefa miantso an'io fiasa io ao amin'ny rejisitra LR isika dia mahazo ny adiresin'ny latabatra voalaza teo aloha (0xB144). Ao amin'ny R0 - index amin'ity tabilao ity. Izany hoe, ny sanda dia alaina amin'ny latabatra, ampiana amin'ny LR ary ny vokatra dia
ny adiresy haleha. Andeha hojerentsika izany: 0xB144 + [0xB144 + 8* 4] = 0xB144 + 0x120 = 0xB264. Mankany amin'ny adiresy voaray izahay ary mahita torolalana mahasoa roa ary mandehana indray amin'ny 0xB140:

Mitady vulnerabilities amin'ny UC Browser

Ankehitriny dia hisy ny fifindrana amin'ny offset miaraka amin'ny index 0x20 avy amin'ny latabatra.

Raha jerena ny haben'ny latabatra dia hisy fiovana maro toy izany ao amin'ny code. Mipetraka ny fanontaniana raha azo atao ve ny miatrika izany ho azy bebe kokoa, tsy misy adiresy kajy amin'ny tanana. Ary ny script sy ny fahafahana mametraka kaody ao amin'ny IDA dia manampy antsika:

def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 2
if get_wide_word(ea1) == 0xbf00: #NOP
ea1 += 2
if get_operand_type(ea1, 0) == 1 and get_operand_value(ea1, 0) == 0 and get_operand_type(ea1, 1) == 2:
index = get_wide_dword(get_operand_value(ea1, 1))
print "index =", hex(index)
ea1 += 2
if get_operand_type(ea1, 0) == 7:
table = get_operand_value(ea1, 0) + 4
elif get_operand_type(ea1, 1) == 2:
table = get_operand_value(ea1, 1) + 4
else:
print "Wrong operand type on", hex(ea1), "-", get_operand_type(ea1, 0), get_operand_type(ea1, 1)
table = None
if table is None:
print "Unable to find table"
else:
print "table =", hex(table)
offset = get_wide_dword(table + (index << 2))
put_unconditional_branch(ea, table + offset)
else:
print "Unknown code", get_operand_type(ea1, 0), get_operand_value(ea1, 0), get_operand_type(ea1, 1) == 2
else:
print "Unable to detect first instruction"

Apetraho eo amin'ny tsipika 0xB26A ny cursor, tanteraho ny script ary jereo ny fifindrana mankany 0xB4B0:

Mitady vulnerabilities amin'ny UC Browser

IDA indray dia tsy nahalala an'io faritra io ho code. Manampy azy izahay ary mahita endrika hafa any:

Mitady vulnerabilities amin'ny UC Browser

Toa tsy dia misy dikany loatra ny toromarika aorian'ny BLX, toy ny karazana fifindran-toerana. Andeha hojerentsika ny sub_4964:

Mitady vulnerabilities amin'ny UC Browser

Ary eny tokoa, misy teny iray raisina amin'ny adiresy ao amin'ny LR, ampiana amin'ity adiresy ity, ary avy eo dia alaina ny sandan'ny adiresy aterak'izany ary apetraka eo amin'ny stack. Ary koa, 4 dia ampiana amin'ny LR ka aorian'ny fiverenana avy amin'ny fiasa, io offset io ihany dia adino. Avy eo ny baiko POP {R1} dia maka ny sanda azo avy amin'ny stack. Raha mijery izay hita ao amin'ny adiresy 0xB4BA + 0xEA = 0xB5A4 ianao dia hahita zavatra mitovy amin'ny latabatra adiresy:

Mitady vulnerabilities amin'ny UC Browser

Mba hamehezana an'io endrika io dia mila masontsivana roa avy amin'ny kaody ianao: ny offset sy ny laharan'ny rejisitra izay tianao hametrahana ny valiny. Ho an'ny rejisitra tsirairay azo atao dia tsy maintsy manomana kaody iray mialoha ianao.

patches = {}
patches[0] = (0x00, 0xbf, 0x01, 0x48, 0x00, 0x68, 0x02, 0xe0)
patches[1] = (0x00, 0xbf, 0x01, 0x49, 0x09, 0x68, 0x02, 0xe0)
patches[2] = (0x00, 0xbf, 0x01, 0x4a, 0x12, 0x68, 0x02, 0xe0)
patches[3] = (0x00, 0xbf, 0x01, 0x4b, 0x1b, 0x68, 0x02, 0xe0)
patches[4] = (0x00, 0xbf, 0x01, 0x4c, 0x24, 0x68, 0x02, 0xe0)
patches[5] = (0x00, 0xbf, 0x01, 0x4d, 0x2d, 0x68, 0x02, 0xe0)
patches[8] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x80, 0xd8, 0xf8, 0x00, 0x80, 0x01, 0xe0)
patches[9] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0x90, 0xd9, 0xf8, 0x00, 0x90, 0x01, 0xe0)
patches[10] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xa0, 0xda, 0xf8, 0x00, 0xa0, 0x01, 0xe0)
patches[11] = (0x00, 0xbf, 0xdf, 0xf8, 0x06, 0xb0, 0xdb, 0xf8, 0x00, 0xb0, 0x01, 0xe0)
ea = here()
if (get_wide_word(ea) == 0xb082 #SUB SP, SP, #8
and get_wide_word(ea + 2) == 0xb503): #PUSH {R0,R1,LR}
if get_operand_type(ea + 4, 0) == 7:
pop = get_bytes(ea + 12, 4, 0)
if pop[1] == 'xbc':
register = -1
r = get_wide_byte(ea + 12)
for i in range(8):
if r == (1 << i):
register = i
break
if register == -1:
print "Unable to detect register"
else:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
if ea % 4 != 0:
ea += 2
patch_dword(ea, address)
elif pop[:3] == 'x5dxf8x04':
register = ord(pop[3]) >> 4
if register in patches:
address = get_wide_dword(ea + 8) + ea + 8
for b in patches[register]:
patch_byte(ea, b)
ea += 1
patch_dword(ea, address)
else:
print "POP instruction not found"
else:
print "Wrong operand type on +4:", get_operand_type(ea + 4, 0)
else:
print "Unable to detect first instructions"

Mametraka ny cursor eo am-piandohan'ny rafitra izay tiantsika hosoloina - 0xB4B2 - ary mihazakazaka ny script:

Mitady vulnerabilities amin'ny UC Browser

Ho fanampin'ireo rafitra efa voalaza, ny code dia misy ireto manaraka ireto:

Mitady vulnerabilities amin'ny UC Browser

Toy ny tamin'ny tranga teo aloha, aorian'ny fampianarana BLX dia misy ny offset:

Mitady vulnerabilities amin'ny UC Browser

Raisinay amin'ny adiresy avy amin'ny LR ny offset, ampio amin'ny LR ary mandehana any. 0x72044 + 0xC = 0x72050. Ny script ho an'ity famolavolana ity dia tsotra:

def put_unconditional_branch(source, destination):
offset = (destination - source - 4) >> 1
if offset > 2097151 or offset < -2097152:
raise RuntimeError("Invalid offset")
if offset > 1023 or offset < -1024:
instruction1 = 0xf000 | ((offset >> 11) & 0x7ff)
instruction2 = 0xb800 | (offset & 0x7ff)
patch_word(source, instruction1)
patch_word(source + 2, instruction2)
else:
instruction = 0xe000 | (offset & 0x7ff)
patch_word(source, instruction)
ea = here()
if get_wide_word(ea) == 0xb503: #PUSH {R0,R1,LR}
ea1 = ea + 6
if get_wide_word(ea + 2) == 0xbf00: #NOP
ea1 += 2
offset = get_wide_dword(ea1)
put_unconditional_branch(ea, (ea1 + offset) & 0xffffffff)
else:
print "Unable to detect first instruction"

Vokatry ny famonoana script:

Mitady vulnerabilities amin'ny UC Browser

Rehefa voapetaka amin'ny fiasa ny zava-drehetra dia azonao atao ny manondro ny IDA amin'ny tena fiandohany. Izy io dia hanambatra ny kaody fiasa rehetra, ary azo alaina amin'ny fampiasana HexRays.

Decoding tady

Nianatra ny miatrika ny fanakorontanana ny kaody milina ao amin'ny tranomboky izahay libsgmainso-6.4.36.so avy amin'ny UC Browser ary nahazo ny code code JNI_OnLoad.

int __fastcall real_JNI_OnLoad(JavaVM *vm)
{
int result; // r0
jclass clazz; // r0 MAPDST
int v4; // r0
JNIEnv *env; // r4
int v6; // [sp-40h] [bp-5Ch]
int v7; // [sp+Ch] [bp-10h]
v7 = *(_DWORD *)off_8AC00;
if ( !vm )
goto LABEL_39;
sub_7C4F4();
env = (JNIEnv *)sub_7C5B0(0);
if ( !env )
goto LABEL_39;
v4 = sub_72CCC();
sub_73634(v4);
sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);
if ( clazz
&& (sub_9EE4(),
sub_71D68(env),
sub_E7DC(env) >= 0
&& sub_69D68(env) >= 0
&& sub_197B4(env, clazz) >= 0
&& sub_E240(env, clazz) >= 0
&& sub_B8B0(env, clazz) >= 0
&& sub_5F0F4(env, clazz) >= 0
&& sub_70640(env, clazz) >= 0
&& sub_11F3C(env) >= 0
&& sub_21C3C(env, clazz) >= 0
&& sub_2148C(env, clazz) >= 0
&& sub_210E0(env, clazz) >= 0
&& sub_41B58(env, clazz) >= 0
&& sub_27920(env, clazz) >= 0
&& sub_293E8(env, clazz) >= 0
&& sub_208F4(env, clazz) >= 0) )
{
result = (sub_B7B0(env, clazz) >> 31) | 0x10004;
}
else
{
LABEL_39:
result = -1;
}
return result;
}

Andeha hojerentsika akaiky ireto andalana manaraka ireto:

  sub_73E24(&unk_83EA6, &v6, 49);
clazz = (jclass)((int (__fastcall *)(JNIEnv *, int *))(*env)->FindClass)(env, &v6);

Amin'ny asany sub_73E24 mazava be ny anaran'ny kilasy. Ho mari-pamantarana amin'ity asa ity dia misy tondro ho an'ny angon-drakitra mitovy amin'ny angon-drakitra voatahiry, buffer iray ary isa iray. Mazava ho azy fa aorian'ny fiantsoana ny fiasa dia hisy tsipika voahidy ao amin'ny buffer, satria alefa amin'ny fiasa izany FindClass, izay maka ny anaran'ny kilasy ho paramètre faharoa. Noho izany, ny isa dia ny haben'ny buffer na ny halavan'ny tsipika. Andeha hojerentsika ny anaran'ny kilasy, tokony hilaza amintsika izy raha mandeha amin'ny lalana marina isika. Andeha hojerentsika akaiky ny zava-mitranga ao sub_73E24.

int __fastcall sub_73E56(unsigned __int8 *in, unsigned __int8 *out, size_t size)
{
int v4; // r6
int v7; // r11
int v8; // r9
int v9; // r4
size_t v10; // r5
int v11; // r0
struc_1 v13; // [sp+0h] [bp-30h]
int v14; // [sp+1Ch] [bp-14h]
int v15; // [sp+20h] [bp-10h]
v4 = 0;
v15 = *(_DWORD *)off_8AC00;
v14 = 0;
v7 = sub_7AF78(17);
v8 = sub_7AF78(size);
if ( !v7 )
{
v9 = 0;
goto LABEL_12;
}
(*(void (__fastcall **)(int, const char *, int))(v7 + 12))(v7, "DcO/lcK+h?m3c*q@", 16);
if ( !v8 )
{
LABEL_9:
v4 = 0;
goto LABEL_10;
}
v4 = 0;
if ( !in )
{
LABEL_10:
v9 = 0;
goto LABEL_11;
}
v9 = 0;
if ( out )
{
memset(out, 0, size);
v10 = size - 1;
(*(void (__fastcall **)(int, unsigned __int8 *, size_t))(v8 + 12))(v8, in, v10);
memset(&v13, 0, 0x14u);
v13.field_4 = 3;
v13.field_10 = v7;
v13.field_14 = v8;
v11 = sub_6115C(&v13, &v14);
v9 = v11;
if ( v11 )
{
if ( *(_DWORD *)(v11 + 4) == v10 )
{
qmemcpy(out, *(const void **)v11, v10);
v4 = *(_DWORD *)(v9 + 4);
}
else
{
v4 = 0;
}
goto LABEL_11;
}
goto LABEL_9;
}
LABEL_11:
sub_7B148(v7);
LABEL_12:
if ( v8 )
sub_7B148(v8);
if ( v9 )
sub_7B148(v9);
return v4;
}

asa sub_7AF78 dia mamorona ohatra iray amin'ny container ho an'ny array byte amin'ny habe voafaritra (tsy hiresaka amin'ny antsipiriany momba ireo fitoeran-javatra ireo izahay). Eto dia misy kaontenera roa toy izany: misy ny tsipika ny iray "DcO/lcK+h?m3c*q@" (mora ny maminavina fa fanalahidy ity), ny iray hafa dia misy angon-drakitra voatahiry. Manaraka, ny zavatra roa dia apetraka amin'ny rafitra iray, izay ampitaina amin'ny asa sub_6115C. Andeha koa hanisy marika saha misy ny sanda 3 amin'ity rafitra ity. Andeha hojerentsika izay hitranga amin'ity rafitra ity manaraka.

int __fastcall sub_611B4(struc_1 *a1, _DWORD *a2)
{
int v3; // lr
unsigned int v4; // r1
int v5; // r0
int v6; // r1
int result; // r0
int v8; // r0
*a2 = 820000;
if ( a1 )
{
v3 = a1->field_14;
if ( v3 )
{
v4 = a1->field_4;
if ( v4 < 0x19 )
{
switch ( v4 )
{
case 0u:
v8 = sub_6419C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 3u:
v8 = sub_6364C(a1->field_0, a1->field_10, v3);
goto LABEL_17;
case 0x10u:
case 0x11u:
case 0x12u:
v8 = sub_612F4(
a1->field_0,
v4,
*(_QWORD *)&a1->field_8,
*(_QWORD *)&a1->field_8 >> 32,
a1->field_10,
v3,
a2);
goto LABEL_17;
case 0x14u:
v8 = sub_63A28(a1->field_0, v3);
goto LABEL_17;
case 0x15u:
sub_61A60(a1->field_0, v3, a2);
return result;
case 0x16u:
v8 = sub_62440(a1->field_14);
goto LABEL_17;
case 0x17u:
v8 = sub_6226C(a1->field_10, v3);
goto LABEL_17;
case 0x18u:
v8 = sub_63530(a1->field_14);
LABEL_17:
v6 = 0;
if ( v8 )
{
*a2 = 0;
v6 = v8;
}
return v6;
default:
LOWORD(v5) = 28032;
goto LABEL_5;
}
}
}
}
LOWORD(v5) = -27504;
LABEL_5:
HIWORD(v5) = 13;
v6 = 0;
*a2 = v5;
return v6;
}

Ny mari-pamantarana switch dia saha rafitra izay nomena ny sanda 3 teo aloha. Jereo ny tranga 3: amin'ny asa sub_6364C ny masontsivana dia alefa avy amin'ny rafitra izay nampiana tao amin'ny asa teo aloha, izany hoe ny fanalahidy sy angon-drakitra miafina. Raha jerena akaiky ny sub_6364C, azonao fantarina ny algorithm RC4 ao anatiny.

Manana algorithm sy fanalahidy isika. Andeha hojerentsika ny anaran'ny kilasy. Izao no nitranga: com/taobao/wireless/security/adapter/JNICLibrary. Mahafinaritra! Eo amin'ny lalana marina isika.

Hazo baiko

Mila mitady fanamby isika izao RegisterNatives, izay hanoro antsika ny asa doCommandNative. Andeha hojerentsika ny asa antsoina avy JNI_OnLoad, ary hitanay ao sub_B7B0:

int __fastcall sub_B7F6(JNIEnv *env, jclass clazz)
{
char signature[41]; // [sp+7h] [bp-55h]
char name[16]; // [sp+30h] [bp-2Ch]
JNINativeMethod method; // [sp+40h] [bp-1Ch]
int v8; // [sp+4Ch] [bp-10h]
v8 = *(_DWORD *)off_8AC00;
decryptString((unsigned __int8 *)&unk_83ED9, (unsigned __int8 *)name, 0x10u);// doCommandNative
decryptString((unsigned __int8 *)&unk_83EEA, (unsigned __int8 *)signature, 0x29u);// (I[Ljava/lang/Object;)Ljava/lang/Object;
method.name = name;
method.signature = signature;
method.fnPtr = sub_B69C;
return ((int (__fastcall *)(JNIEnv *, jclass, JNINativeMethod *, int))(*env)->RegisterNatives)(env, clazz, &method, 1) >> 31;
}

Ary eny tokoa, fomba amam-panao miaraka amin'ny anarana no voasoratra eto doCommandNative. Fantatray izao ny adiresiny. Andeha hojerentsika izay ataony.

int __fastcall doCommandNative(JNIEnv *env, jobject obj, int command, jarray args)
{
int v5; // r5
struc_2 *a5; // r6
int v9; // r1
int v11; // [sp+Ch] [bp-14h]
int v12; // [sp+10h] [bp-10h]
v5 = 0;
v12 = *(_DWORD *)off_8AC00;
v11 = 0;
a5 = (struc_2 *)malloc(0x14u);
if ( a5 )
{
a5->field_0 = 0;
a5->field_4 = 0;
a5->field_8 = 0;
a5->field_C = 0;
v9 = command % 10000 / 100;
a5->field_0 = command / 10000;
a5->field_4 = v9;
a5->field_8 = command % 100;
a5->field_C = env;
a5->field_10 = args;
v5 = sub_9D60(command / 10000, v9, command % 100, 1, (int)a5, &v11);
}
free(a5);
if ( !v5 && v11 )
sub_7CF34(env, v11, &byte_83ED7);
return v5;
}

Amin'ny anarana dia azonao vinavinaina fa eto ny fidirana amin'ireo fiasa rehetra izay nanapahan'ny mpamorona hamindra any amin'ny tranomboky teratany. Ireo singa mifandraika amin'ny 10601

Hitanao avy amin'ny kaody fa ny laharana baiko dia mamokatra isa telo: baiko/10000, baiko % 10000 / 100 и baiko % 10, izany hoe, amin'ny tranga misy antsika, 1, 6 ary 1. Ireo isa telo ireo, ary koa ny tondro mankany JNIEnv ary ny arguments ampitaina amin'ny asa dia ampidirina amina rafitra iray ary ampitaina. Amin'ny fampiasana ireo isa telo azo (aleo atao hoe N1, N2 ary N3) dia misy hazo baiko natsangana.

Misy zavatra toy izao:

Mitady vulnerabilities amin'ny UC Browser

Feno dynamic in ny hazo JNI_OnLoad.
Tarehimarika telo no mandrakotra ny lalana amin'ny hazo. Ny ravin'ny hazo tsirairay dia misy ny adiresin'ny asa mifandraika amin'izany. Ny fanalahidy dia ao amin'ny node ray aman-dreny. Tsy sarotra ny fitadiavana ny toerana ao amin'ny code izay ampiana ny asa ilaintsika amin'ny hazo raha azonao ny rafitra rehetra ampiasaina (tsy mamaritra azy ireo izahay mba tsy hanapotika lahatsoratra efa lehibe).

Obfuscation bebe kokoa

Nahazo ny adiresin'ny asa tokony hamadika ny fifamoivoizana izahay: 0x5F1AC. Saingy aloha loatra ny mifaly: nanomana tsy ampoizina hafa ho antsika ireo mpamorona ny UC Browser.

Rehefa avy nahazo ny masontsivana avy amin'ny array izay niforona tao amin'ny code Java dia mahazo
mankany amin'ny fiasa amin'ny adiresy 0x4D070. Ary eto dia misy karazana fehezan-dalàna hafa miandry antsika.

Nametraka indices roa ao amin'ny R7 sy R4 izahay:

Mitady vulnerabilities amin'ny UC Browser

Afindrantsika amin'ny R11 ny tondro voalohany:

Mitady vulnerabilities amin'ny UC Browser

Mba hahazoana adiresy avy amin'ny latabatra iray dia ampiasao index:

Mitady vulnerabilities amin'ny UC Browser

Aorian'ny fandehanana any amin'ny adiresy voalohany dia ampiasaina ny fanondroana faharoa, izay ao amin'ny R4. Misy singa 230 eo amin'ny latabatra.

Inona no hatao amin'izany? Azonao atao ny milaza amin'ny IDA fa switch ity: Edit -> Other -> Idiom switch.

Mitady vulnerabilities amin'ny UC Browser

Mahatsiravina ny kaody vokatr'izany. Saingy, rehefa mamakivaky ny ala mikitroka ianao, dia afaka mahatsikaritra antso amin'ny fiasa efa mahazatra antsika sub_6115C:

Mitady vulnerabilities amin'ny UC Browser

Nisy switch izay raha 3 dia nisy decryption mampiasa ny RC4 algorithm. Ary amin'ity tranga ity, ny rafitra mandalo amin'ny asa dia feno avy amin'ny masontsivana nandalo doCommandNative. Aoka hotsaroantsika izay nananantsika tany magicInt miaraka amin'ny sanda 16. Mijery ny tranga mifanaraka amin'izany isika - ary aorian'ny fifindrana maromaro dia mahita ny kaody izay ahafahana mamantatra ny algorithm.

Mitady vulnerabilities amin'ny UC Browser

Ity no AES!

Ny algorithm dia misy, ny hany sisa tavela dia ny fahazoana ny masontsivana azy: mode, key ary, angamba, ny véctor initialization (miankina amin'ny fomba fiasan'ny algorithm AES ny fisiany). Ny rafitra miaraka amin'izy ireo dia tsy maintsy miforona any amin'ny toerana iray alohan'ny fiantsoana asa sub_6115C, fa io ampahany amin'ny kaody io dia voasakantsakan'ny tsara indrindra, noho izany dia mipoitra ny hevitra hametaka ny kaody mba hatsipy ao anaty rakitra ny masontsivana rehetra amin'ny asa decryption.

Patch

Mba tsy hanoratana ny kaody patch rehetra amin'ny fiteny fivorian'ny tanana dia azonao atao ny manomboka ny Android Studio, manorata asa iray ao izay mahazo ny mari-pamantarana fidirana mitovy amin'ny fiasan-tsika decryption ary manoratra amin'ny rakitra iray, dia kopia-mametaka ny kaody izay hataon'ny compiler. miteraka.

Ny namanay avy amin'ny ekipan'ny UC Browser dia nikarakara ny fanamorana ny fampidirana kaody. Aoka hotsaroantsika fa eo am-piandohan'ny fiasa tsirairay dia manana fehezan-dalàna fako izay azo soloina mora foana amin'ny hafa. Tena mety 🙂 Na izany aza, amin'ny fiandohan'ny tanjona kendrena dia tsy ampy ny toerana ho an'ny kaody izay mamonjy ny mari-pamantarana rehetra amin'ny rakitra iray. Tsy maintsy nozaraiko ho tapany ilay izy ary nampiasa ny fako avy amin'ny asa manodidina. Nisy ampahany efatra ny fitambarany.

Ny ampahany voalohany:

Mitady vulnerabilities amin'ny UC Browser

Ao amin'ny maritrano ARM, ny mari-pamantarana fiasa efatra voalohany dia mandalo amin'ny rejisitra R0-R3, ny ambiny, raha misy, dia mandalo amin'ny stack. Ny rejisitra LR dia mitondra ny adiresy fiverenana. Izany rehetra izany dia mila tehirizina mba hahafahan'ny fiasa miasa aorian'ny fanarianay ny paramètre. Mila mitahiry ireo rejisitra rehetra izay hampiasainay amin'ny dingana ihany koa izahay, ka manao PUSH.W {R0-R10,LR} izahay. Ao amin'ny R7 dia mahazo ny adiresin'ny lisitry ny masontsivana alefa amin'ny fiasa amin'ny alàlan'ny stack.

Mampiasa ny asa fopen andao hanokatra ny rakitra /data/local/tmp/aes amin'ny fomba "ab".
izany hoe ho fanampin-javatra. Ao amin'ny R0 dia mametraka ny adiresin'ny anaran'ny rakitra, ao amin'ny R1 - ny adiresin'ny tsipika manondro ny fomba. Ary eto dia mifarana ny kaody fako, ka miroso amin'ny asa manaraka isika. Mba hanohizana ny asa dia apetrakay eo am-piandohana ny fifindrana mankany amin'ny tena fehezan-dalàna amin'ny asa, miala amin'ny fako, ary raha tokony ho ny fako dia ampianay ny fitohizan'ny patch.

Mitady vulnerabilities amin'ny UC Browser

fiantsoana fopen.

Ny masontsivana telo voalohany amin'ny asa AES manana karazana int. Koa satria namonjy ny rejisitra tamin'ny stack tany am-piandohana izahay dia afaka mandalo fotsiny ilay fiasa fwrite ny adiresiny ao amin'ny stack.

Mitady vulnerabilities amin'ny UC Browser

Manaraka izany dia manana rafitra telo isika izay misy ny haben'ny angona sy ny tondro ho an'ny angon-drakitra ho an'ny fanalahidy, ny fika voalohany ary ny angon-drakitra voatahiry.

Mitady vulnerabilities amin'ny UC Browser

Amin'ny farany, manakatona ny rakitra, mamerina ny rejisitra ary mamindra ny fanaraha-maso amin'ny tena fiasa AES.

Manangona APK misy tranomboky voapetaka izahay, sonia, ampidiro ao amin'ny fitaovana/emulator, ary atombohy. Hitantsika fa noforonina ny fanariantsika, ary betsaka ny angona voasoratra ao. Ny navigateur dia mampiasa encryption tsy ho an'ny fifamoivoizana ihany, ary ny encryption rehetra dia mandalo amin'ny asa resahina. Saingy noho ny antony tsy misy ny angon-drakitra ilaina, ary ny fangatahana takiana dia tsy hita amin'ny fifamoivoizana. Mba tsy hiandry mandra-piandry ny UC Browser hanao ny fangatahana ilaina, andao haka ny valin-kafatra voatahiry avy amin'ny mpizara voaray teo aloha ary apetaho indray ny fampiharana: ampio ny decryption amin'ny onCreate amin'ny hetsika lehibe.

    const/16 v1, 0x62
new-array v1, v1, [B
fill-array-data v1, :encrypted_data
const/16 v0, 0x1f
invoke-static {v0, v1}, Lcom/uc/browser/core/d/c/g;->j(I[B)[B
move-result-object v1
array-length v2, v1
invoke-static {v2}, Ljava/lang/String;->valueOf(I)Ljava/lang/String;
move-result-object v2
const-string v0, "ololo"
invoke-static {v0, v2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I

Manangona, manao sonia, mametraka, manomboka. Nahazo NullPointerException izahay satria ny fomba dia namerina ny null.

Nandritra ny famakafakana bebe kokoa momba ny kaody, dia hita fa misy fiasa izay mamadika andalana mahaliana: "META-INF/" sy ".RSA". Toa manamarina ny taratasy fanamarinana ny fampiharana. Na koa miteraka fanalahidy avy aminy. Tsy te-hiresaka momba ny zava-mitranga amin'ny taratasy fanamarinana aho, noho izany dia hosoratanay ny taratasy fanamarinana marina. Andao amboarina ny tsipika misy encryption mba ho solon'ny "META-INF/" dia mahazo "BLABLINF/", mamorona lahatahiry misy an'io anarana io ao amin'ny APK ary ampio ny taratasy fanamarinana navigateur squirrel ao.

Manangona, manao sonia, mametraka, manomboka. Bingo! Manana ny fanalahidy izahay!

MitM

Nahazo lakile sy véctor fanombohana mitovy amin'ny fanalahidy izahay. Andao hiezaka hamadika ny valintenin'ny mpizara amin'ny fomba CBC.

Mitady vulnerabilities amin'ny UC Browser

Hitantsika ny URL arsiva, zavatra mitovy amin'ny MD5, "extract_unzipsize" ary isa iray. Manamarina izahay: mitovy ny MD5 amin'ny arisiva, mitovy ny haben'ny tranomboky tsy voafehy. Miezaka mametaka ity tranomboky ity izahay ary manome izany amin'ny navigateur. Mba hampisehoana fa feno ny tranombokinay voapetaka, dia hanomboka ny fikasana hamorona SMS misy soratra hoe "PWNED!" Hanolo valiny roa avy amin'ny mpizara izahay: puds.ucweb.com/upgrade/index.xhtml ary hisintona ny arisiva. Amin'ny voalohany dia manolo ny MD5 isika (tsy miova ny habeny aorian'ny famoahana azy), amin'ny faharoa dia manome ny arisiva miaraka amin'ny tranomboky voapetaka.

Miezaka misintona ny arisiva imbetsaka ny navigateur, ary avy eo dia misy hadisoana. Toa zavatra
tsy tiany. Vokatry ny famakafakana ity endrika manjavozavo ity dia hita fa mampita ny haben'ny rakitra ihany koa ny mpizara:

Mitady vulnerabilities amin'ny UC Browser

Voakodia ao amin'ny LEB128 izy io. Taorian'ny patch dia niova kely ny haben'ny arisiva miaraka amin'ny tranomboky, noho izany dia nihevitra ny navigateur fa nalaina an-keriny ilay arisiva, ary taorian'ny fanandramana imbetsaka dia nisy fahadisoana.

Ampifanarahintsika ny haben'ny arisiva... Ary – fandresena! 🙂 Ao amin'ny video ny valiny.

https://www.youtube.com/watch?v=Nfns7uH03J8

Vokany sy fanehoan-kevitry ny mpamorona

Toy izany koa, ireo hackers dia afaka mampiasa ny endri-javatra tsy azo antoka amin'ny UC Browser mba hizarana sy hampandehanana tranomboky ratsy. Ireo trano famakiam-boky ireo dia hiasa amin'ny tontolon'ny navigateur, noho izany dia hahazo ny fahazoan-dàlana amin'ny rafitra rehetra izy ireo. Vokatr'izany, ny fahafahana mampiseho fikandrana fikandrana, ary koa ny fidirana amin'ny rakitra miasa amin'ny squirrel voasary, anisan'izany ny fidirana, ny tenimiafina ary ny cookies voatahiry ao amin'ny tahiry.

Nifandray tamin'ireo mpamorona ny UC Browser izahay ary nampahafantatra azy ireo ny olana hitanay, niezaka nanondro ny fahalemena sy ny loza aterany, saingy tsy niresaka na inona na inona taminay izy ireo. Nandritra izany fotoana izany, ny navigateur dia nanohy nampiseho ny endri-javatra mampidi-doza teo imason'ny olona. Saingy rehefa nanambara ny antsipirian'ny faharefoana izahay, dia tsy azo atao intsony ny tsy miraharaha izany toy ny teo aloha. Ny 27 martsa dia
Navoaka ny dikan-teny vaovao an'ny UC Browser 12.10.9.1193, izay niditra tamin'ny mpizara tamin'ny alàlan'ny HTTPS: puds.ucweb.com/upgrade/index.xhtml.

Ankoatr'izay, taorian'ny "fix" ary mandra-pahatongan'ny fotoana nanoratana ity lahatsoratra ity, ny fiezahana hanokatra PDF amin'ny navigateur dia niteraka hafatra diso miaraka amin'ny lahatsoratra hoe "Oops, nisy tsy nety!" Ny fangatahana amin'ny mpizara dia tsy natao rehefa nanandrana nanokatra PDF, fa nisy fangatahana natao rehefa natomboka ny navigateur, izay manondro ny fitohizan'ny fampidinana kaody azo tanterahina amin'ny fanitsakitsahana ny fitsipiky ny Google Play.

Source: www.habr.com

Add a comment