bytedance / appshark

Appshark is a static taint analysis platform to scan vulnerabilities in an Android app.
Apache License 2.0
1.49k stars 165 forks source link

污点传播不支持gson.fromJson #70

Closed firmianay closed 8 months ago

firmianay commented 8 months ago

一个简单的例子

1、如果source设置为getJson()的return,sink设置为fromJson的return,可以扫出来;

2、source相同,sink设置为println()的p0,就不能扫出来了,也就是说污点只能传播到person,但不能传播到它的name

class testActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_arbitrary_install)

        val gson = Gson()
        val jsonString = getJson()
        val person: Person = gson.fromJson(jsonString, Person::class.java)

        val name = person.name
        println(name)
    }

    data class Person(var name: String, var age: Int)

    fun getJson(): String {
        return "{\"name\":\"Tom\",\"age\":20}"
    }
}
firmianay commented 8 months ago

污点不能传播的其他例子,我想从uri->commit.@this:

从uri->input可以,从input->output不可以,从output->commit.@this可以

  fun installApk(uri: Uri) {
      val packageInstaller: PackageInstaller = packageManager.packageInstaller
      val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
      val sessionId = packageInstaller.createSession(params)
      val session = packageInstaller.openSession(sessionId)

      val input: InputStream = contentResolver.openInputStream(uri)!!
      val output: OutputStream = session.openWrite("my_app", 0, -1)
      input.copyTo(output)

      session.fsync(output)
      input.close()
      output.close()

      val intent = Intent("action.demo")
      val pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0)
      session.commit(pendingIntent.intentSender)
  }

哦这个我在EngineConfig加上,可以解决:

      "<kotlin.io.ByteStreamsKt: long copyTo$default(java.io.InputStream,java.io.OutputStream,int,int,java.lang.Object)>": {
        "p0->p1": {
          "I": ["p0"],
          "O": ["p1"]
        }
      }
nkbai commented 8 months ago

对于系统库函数,默认的传播规则是所有参数传播给返回值,传播给this指针。

firmianay commented 8 months ago

gson.fromJson这个问题还没有解决