@@ -14,6 +14,7 @@ import (
1414 blockstore "github.com/ipfs/go-ipfs-blockstore"
1515 exchange "github.com/ipfs/go-ipfs-exchange-interface"
1616 logging "github.com/ipfs/go-log"
17+ "github.com/ipfs/go-verifcid"
1718)
1819
1920var log = logging .Logger ("blockservice" )
@@ -130,6 +131,11 @@ func NewSession(ctx context.Context, bs BlockService) *Session {
130131// TODO pass a context into this if the remote.HasBlock is going to remain here.
131132func (s * blockService ) AddBlock (o blocks.Block ) error {
132133 c := o .Cid ()
134+ // hash security
135+ err := verifcid .ValidateCid (c )
136+ if err != nil {
137+ return err
138+ }
133139 if s .checkFirst {
134140 if has , err := s .blockstore .Has (c ); has || err != nil {
135141 return err
@@ -150,6 +156,13 @@ func (s *blockService) AddBlock(o blocks.Block) error {
150156}
151157
152158func (s * blockService ) AddBlocks (bs []blocks.Block ) error {
159+ // hash security
160+ for _ , b := range bs {
161+ err := verifcid .ValidateCid (b .Cid ())
162+ if err != nil {
163+ return err
164+ }
165+ }
153166 var toput []blocks.Block
154167 if s .checkFirst {
155168 toput = make ([]blocks.Block , 0 , len (bs ))
@@ -198,6 +211,11 @@ func (s *blockService) getExchange() exchange.Fetcher {
198211}
199212
200213func getBlock (ctx context.Context , c cid.Cid , bs blockstore.Blockstore , fget func () exchange.Fetcher ) (blocks.Block , error ) {
214+ err := verifcid .ValidateCid (c ) // hash security
215+ if err != nil {
216+ return nil , err
217+ }
218+
201219 block , err := bs .Get (c )
202220 if err == nil {
203221 return block , nil
@@ -241,6 +259,18 @@ func getBlocks(ctx context.Context, ks []cid.Cid, bs blockstore.Blockstore, fget
241259 go func () {
242260 defer close (out )
243261
262+ k := 0
263+ for _ , c := range ks {
264+ // hash security
265+ if err := verifcid .ValidateCid (c ); err == nil {
266+ ks [k ] = c
267+ k ++
268+ } else {
269+ log .Errorf ("unsafe CID (%s) passed to blockService.GetBlocks: %s" , c , err )
270+ }
271+ }
272+ ks = ks [:k ]
273+
244274 var misses []cid.Cid
245275 for _ , c := range ks {
246276 hit , err := bs .Get (c )
0 commit comments