horn binary serialization analysis
play

Horn Binary Serialization Analysis HCVS 2016 3rd Workshop on - PowerPoint PPT Presentation

Horn Binary Serialization Analysis HCVS 2016 3rd Workshop on Horn Clauses for Verification and Synthesis Gabriele Paganelli https://gapag.noblogs.org/ gapag@distruzione.org Length Type Data CRC 0 3 4 7 8 N N+1 N+4 Type


  1. Horn Binary Serialization Analysis HCVS 2016 3rd Workshop on Horn Clauses for Verification and Synthesis Gabriele Paganelli https://gapag.noblogs.org/ gapag@distruzione.org

  2. Length Type Data CRC 0 3 4 7 8 N N+1 N+4 Type Data Length CRC 0 3 4 N N+1 N+4 N+5 N+8 Cat.png

  3. Contribution ● Given a layout specification, Length Type Data CRC 0 3 4 7 8 N N+1 N+4 Is there a parser that can parse any instance stream? Or: is the layout deserializable? In practice: describe a left-to-right parser behaviour using Horn clauses and forward chaining

  4. 1:Formalize a layout specification ● f [Id] : fixed length field ● v [Id] : variable length field ( varfield ) → ß)[Id] : pointer field ● (Id' offset span → (Length 4)Length Length Type Data CRC 0 3 4 7 8 N N+1 N+4 f v f

  5. 2:Give a name to all fields → (Length 4)Length 0 f 1 v 2 f 3 Length Type Data CRC 0 3 4 7 8 N N+1 N+4

  6. 3:Formalize parser's knowledge ● The parser knows... ● Beg(i) : where field i begins ● Len(i) : field i 's length ● Ptr(o,s,i) : field i is a pointer, with offset at o and spanning s fields ● Val(i) : field i 's contents.

  7. 4a:Formalize parser's behaviour → (Length 4)Length 0 f 1 v 2 f 3 Length Type Data CRC 0 3 4 7 8 N N+1 N+4 True Beg(0) ⇒ True ⇒ Len(0) True Len(1) ⇒ True Len(3) ⇒ True Ptr(0,4,0) ⇒

  8. 4b:Formalize parser's behaviour ● Beg(i) ∧ Len(i) Beg(i+1) ∧ Val(i) ⇒ forward ● Beg(i+1) ∧ Len(i) Beg(i) ∧ Val(i) ⇒ backward ● Read a field backward or forward. Beg(0) Beg(1) Len(0) Val(0) Length Type Data CRC 0 3 4 7 8 N N+1 N+4

  9. 4c:Formalize parser's behaviour ● Ptr(o,s,i) Val (i) ∧ Beg(o) Beg(o+s) ⇒ ∧ Jump right ● Ptr(o,s,i) Val (i) ∧ Beg(o+s) Beg(o) ⇒ ∧ Jump left ● Follow a pointer backward or forward. Ptr(0,4,0) Val(0) Beg(4) Beg(0) Length Type Data CRC 0 3 4 7 8 N N+1 N+4

  10. 4cc:(example, continued) ● Beg(i) ∧ Len(i) Beg(i+1) ∧ Val(i) ⇒ forward ● Beg(i+1) ∧ Len(i) Beg(i) ∧ Val(i) ⇒ backward ● Read a field backward or forward. Beg(1) Beg(2) Beg(4) Len(1) Val(1) Len(3) Length Type Data CRC 0 3 4 7 8 N N+1 N+4

  11. 4cc:(example, continued) ● Beg(i) ∧ Len(i) Beg(i+1) ∧ Val(i) ⇒ forward ● Beg(i+1) ∧ Len(i) Beg(i) ∧ Val(i) ⇒ backward ● Read a field backward or forward. Beg(1) Beg(2) Beg(3) Beg(4) Len(1) Val(1) Val(3) Len(3) Length Type Data CRC 0 3 4 7 8 N N+1 N+4

  12. 4cc:(example, continued) ● Beg(i) ∧ Len(i) Beg(i+1) ∧ Val(i) ⇒ forward ● Beg(i+1) ∧ Len(i) Beg(i) ∧ Val(i) ⇒ backward ● Read a field backward or forward. Beg(1) Beg(2) Beg(3) Beg(4) Len(1) Val(1) Val(3) Len(3) Length Type Data CRC 0 3 4 7 8 N N+1 N+4

  13. 4d:Formalize parser's behaviour ● Beg(i) Beg(i+1) ⇒ Len(i) ∧ join ● Compute the length of a field. Beg(3) Beg(2) Length Type Data CRC 0 3 4 7 8 N N+1 N+4 Len(2)

  14. 4d:Formalize parser's behaviour ● Beg(i) Beg(i+1) ⇒ Len(i) ∧ join ● Compute the length of a field. Beg(3) Beg(2) Length Type Data CRC 0 3 4 7 8 N N+1 N+4 Len(2)

  15. Deserializability Check Algorithm ● Transform a layout into a Horn KB: O(3n) ● Apply forward chaining: O(3n) ● Is Len(i) for all i in a layout in KB? O(n) Yes: Layout is deserializable No: Layout is not deserializable.

  16. Implementation → (Length 4)Length f v f → (Length 4)Length 0 f 1 v 2 f 3 Axioms CLIPS ∀ i ⇒ Yes Python len(i) ?

  17. N ecessary condition for deserialization ● If layout L is deserializable, THEN in L – for every v i – There is a (foo → s ) p , x foo q ● Such that q ≤ i < q+s – e.g. : f v f → – (Length 4) Length 0 f 1 v 2 f 3 – But: (Foo 4)Foo v v v →

  18. Repetition (Kleene star) : []* → (Foo 2)Foo f [f v f ]*

  19. Repetition (Kleene star) : []* → (Foo 2)Foo f [f v f ]* → (Foo 2) Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2 s l e b a l t s i L s l e b a l l a r u t a n f o d a e t s n i

  20. Non valid layout specs → ● (Bar 2) 0 [fBar v f]* 1 – Referencing into an inner scope. Pointers cannot offset into inner scopes → (Bar 2) 0 [fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f fBar v f

  21. []* : Predicates → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2 ● Rep(i,l) : field i is a repetition containing l fields ● Replen(i) : the parser knows repetition i 's length

  22. What about the axioms? ● Lifted to the list label level: ● e.g: ⇒ Len(b.a) Beg(b.a) Beg(b.a+1) join ∧ Ptr(b.a,s,i) Val(i) Beg(b.a) ∧ ∧ Jump right ⇒ Beg(b.a+s) b,i :list s,a : natural

  23. []* : Axioms → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2 ● True ⇒ Rep(i,l) in this layout: True ⇒ Rep(2,3) ● Rep(b.a,l) Beg(b.a) Beg(b.a+1) ∧ ∧ ⇒ RepLen(b.a) ● Rep(b.a,l) Beg(b.a) Beg(b.a.0) ∧ ⇒ ● Rep(b.a,l) Beg(b.a+1) Beg(b.a.l) ∧ ⇒

  24. []* : → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2 Forward Jump Forward right

  25. []* : → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2 forward join backward ● Rep(2,3) Beg(2) Beg(2.0) ∧ ⇒ ● Rep(2,3) Beg(3) Beg(2.3) ∧ ⇒

  26. []* : → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 f 2.3 v 2.4 f 2.5 ]* 2 Forward Jump Forward forward → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2

  27. []* : → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 f 2.3 v 2.4 f 2.5 ]* 2 backward forward ● Rep(2,3) Beg(2) Beg(2.0) ∧ ⇒ ● Rep(2,3) Beg(3) Beg(2.3) ∧ ⇒ → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2

  28. Dirty trick → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 ]* 2 → (Foo 2)Foo 0 f 1 [f 2.0 v 2.1 f 2.2 f 2.3 v 2.4 f 2.5 ]* 2 Take each repetition field and double its content.

  29. If L2 is (not) deserializable Then all LN>2 are (not) deserializable Dirty trick F o r m a l l y g u a r a n t e e Take each repetition field and double its content. d : I f L 2 i s d e s e r i a l i z a b l e , (Just once, not for the doubled repetitions!) T h e n L i s d e s e r i a l i z a b l e → L (A 2)A 0 f 1 [f 2.0 → [(B 1)B, v]* 2.1 f 2.2 ]* 2 → L2 (A 2)A 0 f 1 [f 2.0 O(kn) → → [(B 1)B v (C 1)C v]* 2.1 → f 2.2 f 2.3 [D 1)D v]* 2.4 f 2.5 ]* 2 Axioms are left undisturbed.

  30. Implementation → (Length 4)Length [f v]* f NO → (Length 4)Length [f v f v]* f → (Length 4)Length 0 [f 2.0 v 2.1 f 2.2 v 2.3 ]* 2 f 3 ∀ i ⇒ len(i) ? CLIPS Axioms ∀ Rep(i,j) ⇒ RepLen(i) ? Python

  31. Intended application areas ● Serialization libraries ● Data definition language C!C – Rule-based parser generation? – Associate to each proof of deserializability a parser.

  32. Related work – Erlang, haskell, c... – Pads – Protocol buffers, avro, cap'n'proto, bson...

  33. Summary ● Axiomatization of left-to-right stream parsing ● Implementation: Python+CLIPS ● Interesting results: – Necessary condition for deserializability – Doubling repetitions Gabriele Paganelli https://github.com/gapag/horn-binary-deserialization https://gapag.noblogs.org/ gapag@distruzione.org

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend