Reviewed By: jberdine Differential Revision: D3754285 fbshipit-source-id: 1709a62master
parent
6ad78e7d9c
commit
f64e880c11
@ -0,0 +1,182 @@
|
||||
(*
|
||||
* Copyright (c) 2016 - present Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*)
|
||||
|
||||
open! Utils
|
||||
|
||||
module F = Format
|
||||
module L = Logging
|
||||
|
||||
module JavaSource = struct
|
||||
|
||||
module SourceKind = struct
|
||||
type t =
|
||||
| SharedPreferences (** private data read from SharedPreferences *)
|
||||
| Footprint of AccessPath.t (** source that was read from the environment. *)
|
||||
| Other (** for testing or uncategorized sources *)
|
||||
|
||||
let compare sk1 sk2 = match sk1, sk2 with
|
||||
| SharedPreferences, SharedPreferences -> 0
|
||||
| SharedPreferences, _ -> (-1)
|
||||
| _, SharedPreferences -> 1
|
||||
| Footprint ap1, Footprint ap2 -> AccessPath.compare ap1 ap2
|
||||
| Footprint _, _ -> (-1)
|
||||
| _, Footprint _ -> 1
|
||||
| Other, Other -> 0
|
||||
end
|
||||
|
||||
type kind = SourceKind.t
|
||||
|
||||
type t =
|
||||
{
|
||||
kind : kind;
|
||||
site : CallSite.t;
|
||||
}
|
||||
|
||||
let is_footprint t = match t.kind with
|
||||
| SourceKind.Footprint _ -> true
|
||||
| _ -> false
|
||||
|
||||
let get_footprint_access_path t = match t.kind with
|
||||
| SourceKind.Footprint access_path -> Some access_path
|
||||
| _ -> None
|
||||
|
||||
let call_site t =
|
||||
t.site
|
||||
|
||||
let kind t =
|
||||
t.kind
|
||||
|
||||
let make kind site =
|
||||
{ site; kind; }
|
||||
|
||||
let make_footprint ap site =
|
||||
{ kind = (SourceKind.Footprint ap); site; }
|
||||
|
||||
let get site = match CallSite.pname site with
|
||||
| Procname.Java pname ->
|
||||
begin
|
||||
match Procname.java_get_class_name pname, Procname.java_get_method pname with
|
||||
| "android.content.SharedPreferences", "getString" ->
|
||||
[0, make SharedPreferences site]
|
||||
| "com.facebook.infer.models.InferTaint", "inferSecretSource" ->
|
||||
[0, make Other site]
|
||||
| _ ->
|
||||
[]
|
||||
end
|
||||
| _ -> failwith "Non-Java procname in Java analysis"
|
||||
|
||||
(** make a clone of [t] with a new call site *)
|
||||
let to_return t return_site =
|
||||
{ t with site = return_site; }
|
||||
|
||||
let compare src1 src2 =
|
||||
SourceKind.compare src1.kind src2.kind
|
||||
|> next CallSite.compare src1.site src2.site
|
||||
|
||||
let equal t1 t2 =
|
||||
compare t1 t2 = 0
|
||||
|
||||
let pp fmt s = match s.kind with
|
||||
| SharedPreferences -> F.fprintf fmt "SharedPreferences(%a)" CallSite.pp s.site
|
||||
| Footprint ap -> F.fprintf fmt "Footprint(%a)" AccessPath.pp ap
|
||||
| Other -> F.fprintf fmt "Other(%a)" CallSite.pp s.site
|
||||
|
||||
module Set = PrettyPrintable.MakePPSet(struct
|
||||
type nonrec t = t
|
||||
let compare = compare
|
||||
let pp_element = pp
|
||||
end)
|
||||
end
|
||||
|
||||
module JavaSink = struct
|
||||
|
||||
module SinkKind = struct
|
||||
type t =
|
||||
| Logging (** sink that logs one or more of its arguments *)
|
||||
| Other (** for testing or uncategorized sinks *)
|
||||
|
||||
let compare snk1 snk2 = match snk1, snk2 with
|
||||
| Logging, Logging -> 0
|
||||
| Logging, _ -> (-1)
|
||||
| _, Logging -> 1
|
||||
| Other, Other -> 0
|
||||
end
|
||||
|
||||
type kind = SinkKind.t
|
||||
|
||||
type t =
|
||||
{
|
||||
kind : kind;
|
||||
site : CallSite.t;
|
||||
}
|
||||
|
||||
let kind t =
|
||||
t.kind
|
||||
|
||||
let call_site t =
|
||||
t.site
|
||||
|
||||
let make kind site =
|
||||
{ kind; site; }
|
||||
|
||||
let get site =
|
||||
(* taint all the inputs of [pname] *)
|
||||
let taint_all pname kind site =
|
||||
IList.mapi
|
||||
(fun param_num _ -> param_num,make kind site)
|
||||
(Procname.java_get_parameters pname) in
|
||||
match CallSite.pname site with
|
||||
| Procname.Java pname ->
|
||||
begin
|
||||
match Procname.java_get_class_name pname, Procname.java_get_method pname with
|
||||
| "android.util.Log", ("d" | "e" | "i" | "println" | "v" | "w" | "wtf") ->
|
||||
taint_all pname Logging site
|
||||
| "com.facebook.infer.models.InferTaint", "inferSensitiveSink" ->
|
||||
[0, make Other site]
|
||||
| _ ->
|
||||
[]
|
||||
end
|
||||
| _ -> failwith "Non-Java procname in Java analysis"
|
||||
|
||||
let to_callee t callee_site =
|
||||
{ t with site = callee_site; }
|
||||
|
||||
let compare snk1 snk2 =
|
||||
SinkKind.compare snk1.kind snk2.kind
|
||||
|> next CallSite.compare snk1.site snk2.site
|
||||
|
||||
let equal t1 t2 =
|
||||
compare t1 t2 = 0
|
||||
|
||||
let pp fmt s = match s.kind with
|
||||
| Logging -> F.fprintf fmt "Logging(%a)" CallSite.pp s.site
|
||||
| Other -> F.fprintf fmt "%a" CallSite.pp s.site
|
||||
|
||||
module Set = PrettyPrintable.MakePPSet(struct
|
||||
type nonrec t = t
|
||||
let compare = compare
|
||||
let pp_element = pp
|
||||
end)
|
||||
end
|
||||
|
||||
include
|
||||
Trace.Make(struct
|
||||
module Source = JavaSource
|
||||
module Sink = JavaSink
|
||||
|
||||
let should_report source sink =
|
||||
let open Source in
|
||||
let open Sink in
|
||||
match Source.kind source, Sink.kind sink with
|
||||
| SourceKind.Other, SinkKind.Other
|
||||
| SourceKind.SharedPreferences, SinkKind.Logging ->
|
||||
true
|
||||
| _ ->
|
||||
false
|
||||
end)
|
@ -0,0 +1,10 @@
|
||||
(*
|
||||
* Copyright (c) 2016 - present Facebook, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This source code is licensed under the BSD style license found in the
|
||||
* LICENSE file in the root directory of this source tree. An additional grant
|
||||
* of patent rights can be found in the PATENTS file in the same directory.
|
||||
*)
|
||||
|
||||
include Trace.S
|
Loading…
Reference in new issue