From 0db5196d796ab47f2abba06ae6cc056115f2ee5b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Ebeling?= Date: Mon, 8 Nov 2021 20:17:03 +0100 Subject: [PATCH 1/4] Debuggung output for crash-packet --- ber.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/ber.go b/ber.go index 95755fe..f0573ec 100644 --- a/ber.go +++ b/ber.go @@ -4,6 +4,7 @@ import ( "bytes" "fmt" "io" + "log" "reflect" ) @@ -109,7 +110,7 @@ var TypeMap = map[uint8]string{ TypeConstructed: "Constructed", } -var Debug bool = false +var Debug bool = true func PrintBytes(buf []byte, indent string) { data_lines := make([]string, (len(buf)/30)+1) @@ -191,8 +192,9 @@ func readBytes(reader io.Reader, buf []byte) error { func ReadPacket(reader io.Reader) (*Packet, error) { buf := make([]byte, 2) - err := readBytes(reader, buf) + log.Println("----- local replaced asn1-ber dev version") + err := readBytes(reader, buf) if err != nil { return nil, err } @@ -248,6 +250,8 @@ func ReadPacket(reader io.Reader) (*Packet, error) { for _, b := range buf { fmt.Printf("%02X ", b) } + + fmt.Printf("\n") } p := DecodePacket(buf) @@ -255,7 +259,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { return p, nil } -func DecodeString(data []byte) (string) { +func DecodeString(data []byte) string { return string(data) } From 00b8a5e157289deed165ebffe6b33a625ba1294f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Ebeling?= Date: Tue, 9 Nov 2021 00:13:43 +0100 Subject: [PATCH 2/4] Fixed slice out of bounds panic --- Apehaenger-info.txt | 5 +++++ ber.go | 27 ++++++++++++++++++++++++--- go.mod | 3 +++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 Apehaenger-info.txt create mode 100644 go.mod diff --git a/Apehaenger-info.txt b/Apehaenger-info.txt new file mode 100644 index 0000000..89e28d0 --- /dev/null +++ b/Apehaenger-info.txt @@ -0,0 +1,5 @@ +Partly migrated patch from https://github.com/bollenberger/asn1-ber/commit/4f968084f91b2896cfa8607310c926773b88e9e5 + +Also intersting patches for further fixes: + https://github.com/lanrenwo/asn1-ber/commit/635e465fc083ab99112610e29e0ea3003c9abab0 + https://github.com/rkuris/asn1-ber/commit/3e0ed562590ddf9f0758e08dbe0b766492e48fda \ No newline at end of file diff --git a/ber.go b/ber.go index f0573ec..adeb4ec 100644 --- a/ber.go +++ b/ber.go @@ -2,6 +2,7 @@ package ber import ( "bytes" + "errors" "fmt" "io" "log" @@ -203,7 +204,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { datalen := uint64(buf[1]) if Debug { - fmt.Printf("Read: datalen = %d len(buf) = %d ", datalen, len(buf)) + fmt.Printf("Read: datalen = %d, len(buf) = %d, buf = ", datalen, len(buf)) for _, b := range buf { fmt.Printf("%02X ", b) @@ -255,7 +256,9 @@ func ReadPacket(reader io.Reader) (*Packet, error) { } p := DecodePacket(buf) - + if p == nil { + return nil, errors.New("Failed to decode a BER packet") + } return p, nil } @@ -314,7 +317,9 @@ func decodePacket(data []byte) (*Packet, []byte) { if Debug { fmt.Printf("decodePacket: enter %d\n", len(data)) } - + if len(data) < 2 { + return nil, data + } p := new(Packet) p.ClassType = data[0] & ClassBitmask @@ -323,12 +328,21 @@ func decodePacket(data []byte) (*Packet, []byte) { datalen := DecodeInteger(data[1:2]) datapos := uint64(2) + if Debug { + fmt.Printf("decodePacket: datalen %d, datapos %d\n", datalen, datapos) + } if datalen&128 != 0 { datalen -= 128 + if uint64(len(data)) < 2+datalen { + return nil, data + } datapos += datalen datalen = DecodeInteger(data[2 : 2+datalen]) } + if Debug { + fmt.Printf("decodePacket: datalen %d, datapos %d\n", datalen, datapos) + } p.Data = new(bytes.Buffer) @@ -336,6 +350,10 @@ func decodePacket(data []byte) (*Packet, []byte) { p.Value = nil + if uint64(len(data)) < datapos+datalen { + return nil, data + } + value_data := data[datapos : datapos+datalen] if p.TagType == TypeConstructed { @@ -343,6 +361,9 @@ func decodePacket(data []byte) (*Packet, []byte) { var child *Packet child, value_data = decodePacket(value_data) + if child == nil { + return nil, data + } p.AppendChild(child) } } else if p.ClassType == ClassUniversal { diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f820ea6 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module github.com/nmcclain/asn1-ber + +go 1.14 \ No newline at end of file From ac699986ba276ea13799113eab585cf5b5e448f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Ebeling?= Date: Tue, 9 Nov 2021 22:04:13 +0100 Subject: [PATCH 3/4] Aligned debug msgs --- ber.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/ber.go b/ber.go index adeb4ec..2453b77 100644 --- a/ber.go +++ b/ber.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "io" - "log" "reflect" ) @@ -111,7 +110,7 @@ var TypeMap = map[uint8]string{ TypeConstructed: "Constructed", } -var Debug bool = true +var Debug bool = false func PrintBytes(buf []byte, indent string) { data_lines := make([]string, (len(buf)/30)+1) @@ -193,8 +192,6 @@ func readBytes(reader io.Reader, buf []byte) error { func ReadPacket(reader io.Reader) (*Packet, error) { buf := make([]byte, 2) - log.Println("----- local replaced asn1-ber dev version") - err := readBytes(reader, buf) if err != nil { return nil, err @@ -228,7 +225,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { datalen = DecodeInteger(buf[2 : 2+a]) if Debug { - fmt.Printf("Read: a = %d idx = %d datalen = %d len(buf) = %d", a, idx, datalen, len(buf)) + fmt.Printf("Read: a = %d, idx = %d, datalen = %d, len(buf) = %d, buf = ", a, idx, datalen, len(buf)) for _, b := range buf { fmt.Printf("%02X ", b) @@ -246,7 +243,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { } if Debug { - fmt.Printf("Read: len( buf ) = %d idx=%d datalen=%d idx+datalen=%d\n", len(buf), idx, datalen, idx+datalen) + fmt.Printf("Read: len(buf) = %d, idx = %d, datalen = %d, idx+datalen = %d, buf = ", len(buf), idx, datalen, idx+datalen) for _, b := range buf { fmt.Printf("%02X ", b) @@ -328,9 +325,6 @@ func decodePacket(data []byte) (*Packet, []byte) { datalen := DecodeInteger(data[1:2]) datapos := uint64(2) - if Debug { - fmt.Printf("decodePacket: datalen %d, datapos %d\n", datalen, datapos) - } if datalen&128 != 0 { datalen -= 128 From ba20ac8b3d32df6d7289c27530ee6bb1f032dcc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Ebeling?= Date: Tue, 9 Nov 2021 22:18:24 +0100 Subject: [PATCH 4/4] Cleanup --- Apehaenger-info.txt | 5 ----- ber.go | 1 + go.mod | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 Apehaenger-info.txt diff --git a/Apehaenger-info.txt b/Apehaenger-info.txt deleted file mode 100644 index 89e28d0..0000000 --- a/Apehaenger-info.txt +++ /dev/null @@ -1,5 +0,0 @@ -Partly migrated patch from https://github.com/bollenberger/asn1-ber/commit/4f968084f91b2896cfa8607310c926773b88e9e5 - -Also intersting patches for further fixes: - https://github.com/lanrenwo/asn1-ber/commit/635e465fc083ab99112610e29e0ea3003c9abab0 - https://github.com/rkuris/asn1-ber/commit/3e0ed562590ddf9f0758e08dbe0b766492e48fda \ No newline at end of file diff --git a/ber.go b/ber.go index 2453b77..2ffb663 100644 --- a/ber.go +++ b/ber.go @@ -193,6 +193,7 @@ func ReadPacket(reader io.Reader) (*Packet, error) { buf := make([]byte, 2) err := readBytes(reader, buf) + if err != nil { return nil, err } diff --git a/go.mod b/go.mod index f820ea6..1f6e72b 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,3 @@ module github.com/nmcclain/asn1-ber -go 1.14 \ No newline at end of file +go 1.14